承接上一篇应用内打开其他应用的正确姿势,我们已经能在我们的应用内打开指定功能的应用的Activity,这次我们就让别的应用打开我们的应用玩玩。
分析:
在我们的应用内打开其他的应用是隐式的Intent意图来实现,那我们如果想让别人打开我们的应用应该怎么做呢?
其实我们要做的也很简单,就是告诉系统我们能处理这个隐式的意图就可以了。
话不多说,开始撸代码:
就以打开图片为例吧,我们在文件管理应用中打开图片的时候,系统往往会弹出很多的应用让我们选择,如系统图片查看、各类美图软件、QQ、微信等等,如下图所示。
我们的目标就是在这个列表中把我们的应用也显示出来,点进去之后能显示点击的图片。
一、在清单文件中注册Intent过滤器如下:
<activity android:name=".ui.MainActivity"> <intent-filter> <action android:name="android.intent.action.MAIN"/> <category android:name="android.intent.category.LAUNCHER"/> </intent-filter> <intent-filter> <action android:name="android.intent.action.VIEW"/> <category android:name="android.intent.category.DEFAULT"/> <data android:mimeType="image/*"/> </intent-filter> </activity>第一个intent-filter是系统默认的主启动Activity的过滤器。
第二个intent-filter才是我们设置的过滤器。
1、 <action> 代表要进行的操作,发送信息ACTION_SEND或ACTION_SENDTO,再次我们需要查看图片,所以action为VIEW。
2、 <category>提供另外一种表征处理 Intent 的 Activity 的方法,通常与用户手势或 Activity 启动的位置有关。 系统支持多种不同的类别,但大多数都很少使用。 但是,所有隐含 Intent 默认使用 CATEGORY_DEFAULT 进行定义。
3、 <data> 与 Intent 关联的数据描述。使用此元素中的一个或多个属性,您可以只指定 MIME 类型、URI 前缀、URI 架构或这些的组合以及其他指示所接受数据类型的项。
注:如果您无需声明关于数据的具体信息 Uri(比如,您的 Activity 处理其他类型的“额外”数据而不是 URI 时),您应只指定 android:mimeType您应只指定 android:mimeType 属性声明您的 Activity 处理的数据类型,比如 text/plain 或 image/jpeg。
您只应指定android:mimeType属性声明您的 Activity 处理的数据类型,比如 text/plain 或 image/jpeg。
完成了第一步之后我们就能在点击文件管理的图片的时候看到我们的应用图标也在列表内部了,如下:
到此处虽然我们的应用已经出现在了这个列表中,但是你点进去我们的应用进去发现什么都没有,那是因为我们的应用还没有对接收到的Intent进行相应的操作处理。
接下来就是处理请求也就是我们的下一步。
二、在Activity中进行Intent数据请求的处理,代码如下:
在onCreate方法中进行如下处理,ImageView为布局文件中用来展示图片的View:
Intent intent = getIntent(); if (intent == null){ return; } String action = intent.getAction(); if (Intent.ACTION_VIEW.equals(action)) {//查看图片 Uri uri = intent.getData(); if (null != uri) { Log.d(TAG, "图片地址Path:" + uri.getPath()); mImgView.setImageURI(uri); } }这样之后我们就不能看到展示图片效果了,如下:
当然测试的时候程序崩溃了,原因是图片在外部存储上,这里只需要再声明读取外部存储的权限就可以正常显示了。
好了,今天就到这里。