Android自定义Intent选择器列出活动

时间:2015-03-26 05:31:43

标签: android android-intent

我正在尝试为ACTION_SEND

制作自定义的Intent选择器
PackageManager pm = getApplicationContext().getPackageManager();

Intent shareIntent = new Intent(android.content.Intent.ACTION_SEND)
    .setType("application/octet-stream");

List<Intent> targetedShareIntents = new ArrayList<Intent>();
List<ResolveInfo> resInfo = pm.queryIntentActivities(shareIntent, 0);
Collections.sort(resInfo, new ResolveInfo.DisplayNameComparator(pm));

for (ResolveInfo resolveInfo : resInfo) {
   String packageName = resolveInfo.activityInfo.packageName;
   Intent targetedShareIntent = new Intent(android.content.Intent.ACTION_SEND)
      .setType("application/octet-stream")
      .setPackage(packageName);
   targetedShareIntents.add(targetedShareIntent);
}
Intent chooserIntent = Intent.createChooser(targetedShareIntents.remove(0), "Title");
chooserIntent.putExtra( Intent.EXTRA_INITIAL_INTENTS, targetedShareIntents.toArray(new Parcelable[]{}));
startActivity(chooserIntent);

问题在于,对于具有相同操作的多个活动的应用程序(如ES文件资源管理器),它会多次列为“Android系统”,如图1所示http://imgur.com/a/3TYMA

然后如果选中它,它会为您提供与该应用程序关联的标准Intent选择器,如图2所示

问题:我如何实现一个自定义的Intent选择器,就像内置的一样,每个Activity都列在一起。 如图3所示

1 个答案:

答案 0 :(得分:1)

找到一些东西摆脱“Android系统”文本,现在它显示“ES文件资源管理器”。和es文件资源管理器图标。我添加了这些日志语句:

Log.d(TAG, packageName );
Log.d(TAG, resolveInfo.activityInfo.name );

和ES File Explores的结果是:

 com.estrongs.android.pop
 com.estrongs.android.pop.app.ESFileSharingActivity
 com.estrongs.android.pop
 com.estrongs.android.pop.app.SaveToESActivity

然后我在循环中添加了以下语句:

 targetedShareIntent.setClassName(packageName, resolveInfo.activityInfo.name);

现在您将看到两次ES文件资源管理器。但不幸的是两次相同的信息。和相同的图标。

认为你应该把es文件资源管理器的人邮寄到这篇文章的链接。他们很有帮助。他们会感兴趣。