android 利用隐式Intent打开图片

实现功能

??点击“查看图片”时能够跳出提示,选择系统图库打开还是自己编写的应用打开,并且对于下载好的图片也有效。

  

1.我将 qiaoba.jpg 放在 res/drawable 目录下,通过按钮设置打开图片,在按钮的监听设置如下:

 findViewById(R.id.btn_openImage).setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                //要是自定义应用打开图片必须添加ACTION_VIEW的Intent
                Intent intent = new Intent(Intent.ACTION_VIEW);
                //进行图片-->bitmap-->uri转换
                Bitmap bitmap = BitmapFactory.decodeResource(getResources(),R.drawable.qiaoba);
                //系统提供了现成的API让用户可以将自己喜欢的图片保存到系统相册中.
                String uriString = MediaStore.Images.Media.insertImage(getContentResolver(),bitmap,null,null);
                System.out.println(uriString);
                Uri uri = Uri.parse(uriString);
                //设置数据和类型可以用setData( )或setType( ) ,但是同时设置的话是不生效的,
                // 只能使用setDataAndType( ) ,image代表图片,星号代表图片中所有格式,
                // 可根据自己需要筛选,如只想打开jpg类型图片可用“image/jpg”
                intent.setDataAndType(uri,"image/*");
                startActivity(intent);
            }
        });

2.之前发送了打开图片的请求,接下来添加一个显示图片的java文件“ShowImageAty.java”,并添加一个对应的“aty_show_image.xml”文件

public class ShowImageAty extends AppCompatActivity {
    ImageView ivQiaoba;

    @Override
    protected void onCreate(@Nullable Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.aty_show_image);
        ivQiaoba = (ImageView) findViewById(R.id.iv_qiaoba);
        Intent getImage = getIntent();
        //不为空判断
        if (getImage != null) {
            //获取intent传递过来的uri数据
            Uri data = getImage.getData();
            if (data != null) {
                ivQiaoba.setImageURI(data);
            }
        }

    }
}

3.在AndroidManifest.xml文件中设置intent-filter标签以及注册网络以及文件读写权限

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="com.jikexueyuan.notepad.simplepicturebrowser">

    <!--访问网络权限 -->
    <uses-permission android:name="android.permission.INTERNET" />
    <!-- 读写SD卡权限 -->
    <uses-permission android:name="android.permission.MOUNT_UNMOUNT_FILESYSTEMS" />
    <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
    <uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />

    <application
        android:allowBackup="true"
        android:icon="@mipmap/ic_launcher"
        android:label="@string/app_name"
        android:supportsRtl="true"
        android:theme="@style/AppTheme">
        <activity android:name=".MainActivity">
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />

                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>

        <activity
            android:name=".ShowImageAty"
            android:exported="true">
            <intent-filter>
                <action android:name="android.intent.action.VIEW" />
                <category android:name="android.intent.category.DEFAULT" />
                <!-- 这个属性用于设定数据的MIME类型,如:image/jpeg或audio/mpeg4-generic。
               其子类型可用星号通配符(*)来代替,指示能够跟任何子类型匹配。 -->
                <data android:mimeType="image/*" />
            </intent-filter>
        </activity>

    </application>

</manifest>

另外提一点,如果再android6.0,targetSDKVersion 23 以上运行就要手动注册读写权限了,如果测试版本在 23 以上,会报这样的错

java.lang.SecurityException: Permission Denial: writing com.android.providers.media.MediaProvider uri content://media/external/images/media from pid=2317, uid=10064 requires android.permission.WRITE_EXTERNAL_STORAGE, or grantUriPermission()

手动注册读写权限见:http://blog.csdn.net/dzsw0117/article/details/51212612

时间: 2024-10-08 00:22:34

android 利用隐式Intent打开图片的相关文章

Android基础——隐式intent和intent过滤器

当不直接在intent中指定组件名时,就是隐式使用intent,此时要配合过滤器来使用,找到目标的组件 注册文件 <?xml version="1.0" encoding="utf-8"?> <manifest xmlns:android="http://schemas.android.com/apk/res/android" package="com.example.myintentiii"> <

隐式Intent的使用——Android学习笔记3

隐式Intent的使用 一.为什么要用隐式Intent? 但如果想调用别的程序的组件时,且开发人员往往并不清楚别的应用程序的组件名称,这时我们只能用隐式Intent,隐式Intent恰恰相反,它不会用组件名称定义需要激活的目标组件,而是Android系统帮助应用程序寻找与Intent请求意图最匹配的组件. 二.Android系统怎么找? 主要是通过Intent Filter来寻找与隐式Intent相关的对象.具体的选择方法是:Android将Intent的请求内容<intent-filter>

Android成长之路(7)——关于隐式Intent的用法

Android其中最重要的特性之一,就是一个应用可以基于"action"来切换到另一个应用.比如,你的应用想要查找地方,在地图上显示.但是不一定要创建一个activity来显示地图,可以使用Intent发起一个请求来查看地址,然后Android系统会启动一个可以显示地图的应用. 之前,会使用到显式的Intent来让一个activity跳转到另一个activity.但是,当想要跳转到一个独立的应用时,比如查看地图,这时候就一定要使用隐式Intent. 创建一个隐式Intent 隐式Int

Android开发学习笔记:浅谈显示Intent和隐式Intent

原创作品,允许转载,转载时请务必以超链接形式标明文章 原始出处 .作者信息和本声明.否则将追究法律责任.http://liangruijun.blog.51cto.com/3061169/655132 Intent寻找目标组件的两种方式: 显式Intent:通过指定Intent组件名称来实现的,它一般用在知道目标组件名称的前提下,一般是在相同的应用程序内部实现的. 隐式Intent:通过Intent Filter来实现的,它一般用在没有明确指出目标组件名称的前提下,一般是用于在不同应用程序之间.

Android开发:显式/隐式Intent意图跳转Activity总结

显式跳转 在已知包名和类名的情况下常用的跳转方法: 是 nt mIntent = new Intent(); mIn Int etent.setClassName("com.android.settings","com.android.settings.Settings"); mContext.startActivity(mIntent); 我们也常这么用: y.class); startActivity(intent); 这是跳转到当前应用的某个Activity,

Android开发实践:实战演练隐式Intent的用法

本文通过完成一个实战任务,来掌握Android开发中隐式Intent的用法. 任务:假设我们已经实现了一个视频播放器(PlayerActivity),我们希望能把它注册到系统中,当用户点击本地视频或者在线视频时,能启动这个视频播放器. (假设该类的全路径为:com.jhuster.videoplayer.PlayerActivity) [注]:本文完整的示例代码请到我的Github下载,地址:VideoPlayer 1. 什么是隐式Intent? Intent是Android中比较重要的组件,常

在Android中Intent的概念及应用(一)——显示Intent和隐式Intent

Intent寻找目标组件的两种方式: 显式Intent:通过指定Intent组件名称来实现的,它一般用在知道目标组件名称的前提下,一般是在相同的应用程序内部实现的. 隐式Intent:通过Intent Filter来实现的,它一般用在没有明确指出目标组件名称的前提下,一般是用于在不同应用程序之间. 一.显示Intent: 创建一个Activity的完整过程: 1.手动创建一个类,让其继承自Activity: public class MyAty extends Activity 2.让其绑定一个

android隐式intent使用场景解析

Android 隐式intent相信大家都有用过,大部分场景我们用显式intent已经能满足我们的业务需求,隐式intent大部分都是用来启动系统自带的Activity或Service之类的组件.昨天有个业务场景就是,我在第三方依赖库 module A里面有个Activity A,现在需要在Activity A里面启动 module app里面的Activity B,我想了一下,可以用隐式intent来实现这个功能,而且实现代码最简洁,不用修改或添加其他代码. 隐式intent很简单,首先要在A

隐式Intent找不到Activity:android.content.ActivityNotFoundException

Here is what i encountered: android.content.ActivityNotFoundException: No Activity found to handle Intent { act=me.waye.intentdemo.intent.action.WAYE_ACTION cat=[me.waye.intentdemo.intent.category.WAYE_CATEGORY] } 在学习隐式启动Activity的时候遇到这个错误,用的书是李刚的疯狂An