在应用程序之间使用隐式意图的自定义操作

我一直试图在两个独立的应用程序中使用自定义操作和隐式意图进行两个活动。

第一个应用程序(服务器)具有以下清单:

<application android:icon="@drawable/ic_launcher" android:label="@string/app_name" android:theme="@style/AppTheme"> <activity android:name="edu.example.sharing.manager.SecureFileShare" android:label="@string/title_activity_secure_file_share" android:exported="true"> <intent-filter> <action android:name="android.intent.action.MAIN" /> <category android:name="android.intent.category.LAUNCHER" /> </intent-filter> <intent-filter> <action android:name="edu.example.sharing.action.STORE" /> <category android:name="android.intent.category.DEFAULT" /> <data android:mimeType="*/*" /> </intent-filter> </activity> </application> 

第二个应用程序创build一个意图如下:

 File f = new File(s); Uri fileUri = Uri.fromFile(f); Intent intent = new Intent(); intent.setData(fileUri); intent.setAction("edu.example.sharing.action.STORE"); startActivityForResult(intent, STORE_REQUEST); 

其performance是正常的。 当我尝试在客户端应用程序中发送意图时,我得到一个未发现的活动exception:

 FATAL EXCEPTION: main android.content.ActivityNotFoundException: No Activity found to handle Intent {act=edu.example.sharing.action.STORE dat=file:///storage/sdcard0/Download/Alarcon12-Rigoberto.pdf } at android.app.Instrumentation.checkStartActivityResult(Instrumentation.java:1545) at android.app.Instrumentation.execStartActivity(Instrumentation.java:1416) at android.app.Activity.startActivityForResult(Activity.java:3351) at android.app.Activity.startActivityForResult(Activity.java:3312) 

是什么导致Android无法识别第二个应用程序中声明的活动? 谢谢。

Solutions Collecting From Web of "在应用程序之间使用隐式意图的自定义操作"

看了很多后,我发现:

当您使用内置的操作types并附加数据字段时, 或者当您使用不带数据字段的自定义操作types时,没有data元素的intent-filter也可以。

但是,当您定义自定义操作包含数据字段时,必须手动设置所附URI的mime-type 。 Android文档声称

通常这个types是从数据本身推断出来的。 通过设置此属性,可以禁用该评估并强制显式types。

但事实并非如此。 当我放入一个以.txt结尾的file:// URI时,Android为它指定了一个空mime-type ,所以它不会匹配任何 intent-filter ,即使是带有data*/* mime-type intent-filter 。 我需要使用setDataAndType()手动设置意图的types。

简而言之 :当使用数据的自定义操作时,您必须手动定义意图的mime-type

首先,您只能指定要去哪个应用程序; 你不能指定要去哪里; 我已经回答了如何在这里导航到另一个应用程序; 之后,你的控制权转移到另一个应用程序; 你必须在那里处理