zoukankan      html  css  js  c++  java
  • Android 自己写一个打开图片的Activity

    根据记忆中eoe的Intent相关视频,模仿,写一个打开图片的Activity

    1、在主Activity的button时间中,通过设置action、category、data打开一个图片。这时代码已经可以运行,将使用系统默认的工具打开图片。

    Intent intentImage = new Intent(Intent.ACTION_VIEW);
    intentImage.addCategory(Intent.CATEGORY_DEFAULT);
    File file = new File("/storage/emulated/legacy/Download/xhtml.jpg");
    intentImage.setDataAndType(Uri.fromFile(file), "image/*");
    startActivity(intentImage);

      

    2、自己定义一个Activity,用来展示图片。可以增加一个对应的layout文件,也可以不增加layout文件,直接使用ImageView来呈现图片。需要在Manifest中增加对应的Activity标签。这时再次点击按钮就会出现选择应用程序。

        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            imageView = new ImageView(this);
            setContentView(imageView);
            
            Intent imageIntent = getIntent();
            imageView.setImageURI(imageIntent.getData());
        }
            <activity android:name="ShowImageActivity">
                <intent-filter >
                    <action android:name="android.intent.action.VIEW"/>
                    <category android:name="android.intent.category.DEFAULT"/>
                    <data android:mimeType="image/*" android:scheme="file"/>
                </intent-filter>
            </activity>

    3、经过上面的处理,已经可以选择自己的图片浏览器了。但是在选择使用自己的图片浏览器打开图片的时候,是一片空白,什么都没有,而使用系统默认的工具,则可以正常打开图片。打开LogCat发现以下警告信息“ java.io.FileNotFoundException: /storage/emulated/legacy/Download/xhtml.jpg: open failed: EACCES (Permission denied)”,网上搜索一下即可发现,是因为没有访问该目录的权限,可以参考这个博客android 读取sd卡中的图片。在Manifest文件中增加权限,这次程序可以正常运行了。

    <uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE"/>

    在写这个程序的过程中,发现以下需要注意的地方:

    • 在第1步的代码中,虽然File中对应的目录实际上指向/mnt/shell/emulated/0目录下的内容,但是因为shell目录的权限为drwx------,没有权限访问这个目录,所以只能使用下面的目录访问对应的图片
    • 在第1步的代码中,intentImage.setData(Uri.fromFile(file))这样设置data时,不能打开图片,报错“android.content.ActivityNotFoundException: No Activity found to handle Intent ”,找不到Activity,通过报错可以知道,不设置type的话,系统找不到与其匹配的activity。为了测试,可以在第2步的xml文件中对应的<data>标签,不设置mimeType,只设置scheme。而第1步中的代码也不设置类型,改成intentImage.setData(Uri.fromFile(file))。发现这时就不会报错,会自动调用自己写的这个图片浏览器。
    • intent.setComponent(),设置之后,将精准定位到具体的component。
    • 在Manifest文件中,Activity、Service、Receiver可以通过设置intent-filter标签,在其中加入action、category、data,以后系统通过隐式调用Activity、Service、Receiver时,就可以找到我们定义的Component

    4、可以通过activity的setTheme(int)方法设置显示样式。例如,可以不显示标题、以对话框的方式显示窗口。

  • 相关阅读:
    基本数据类型(int, bool, str)
    循环 运算符 格式化输出 编码
    认识python 变量 数据类型 条件if语句
    简述bug的生命周期?
    性能测试的流程?
    主键、外键的作用,索引的优点与不足?
    需求测试的注意事项有哪些?
    对某软件进行测试,发现在WIN98上运行得很慢,怎么判别是该软件存在问题还是其软硬件运行环境存在问题?
    什么是兼容性测试?请举例说明如何利用兼容性测试列表进行测试。
    如何定位测试用例的作用?
  • 原文地址:https://www.cnblogs.com/huanyou/p/5079040.html
Copyright © 2011-2022 走看看