我想利用内置的Intent Chooser来显示一个自定义过滤的应用列表,供用户选择并启动。
我知道如何获取已安装软件包的列表:
final Intent myIntent = new Intent(android.content.Intent.ACTION_MAIN);
List<ResolveInfo> resInfoList = getPackageManager().queryIntentActivities(myIntent, 0);
现在,我想根据包名中包含的特定字符串(或字符串的变体)过滤列表,我也可以弄清楚如何做。
但我在这里遇到了麻烦。据我所知,Intent.createChooser()
只接受一个目标Intent作为参数。我希望有一个重载,接受一个基于包和类名的Intent列表或其他东西。但我没有看到类似的东西。我错过了什么地方吗?
所以问题是,这是否可以用内置的选择器来完成,或者我必须用AlertDialog Builder来构造自己的选择器?我希望避免后者。
先谢了。
6条答案
按热度按时间jdzmm42g1#
这是我想出的一个解决方案,我用它来为选择器中的每个选择设置不同的Intent数据,但是你也可以很容易地从列表中删除Intent。
虽然使用这种方法,我得到一些应用程序的名称作为Android系统。如果有人得到这个错误,请添加以下行之前
targetedShareIntents.add(targetedShareIntent);
来源:Android share intent Twitter: How to share only by Tweet or Direct Message?
dsf9zpds2#
选择器的唯一一个附加参数是
Intent.EXTRA_INITIAL_INTENTS
,其说明如下:当使用
ACTION_CHOOSER
向用户显示时,使用putExtra(String, Parcelable[])
附加Activity设置的Parcelable[]
Intent或LabeledIntent
对象将放置在选项列表的前面。我还没有在Android源代码中找到任何方法来从列表中排除其他活动,所以似乎没有办法使用选择器来做你想做的事情。
EDIT:这很容易找到。只要检查ChooserActivity和ResolverActivity源代码。这些类相当小。
jdzmm42g3#
我做了一个小的修改,有一个列表的应用程序,你想分享的名称。这几乎是你已经张贴,但添加的应用程序共享的名称
这几乎和Makibo发布的解决方案一样,只是做了一点添加,让你可以很容易地选择你想要分享的应用程序,只需要添加名称,这样你就不会有任何问题,如果他们改变包名或类似的东西。只要他们不改变名称。
i34xakig4#
我的自定义打开选择器的实现。
特点:
roqulrg35#
我尝试做同样的事情,但使用的是ShareActionProvider。gumbercules的帖子中的方法不能很好地与ShareActionProvider一起工作,所以我复制并修改了ShareActionProvider相关的类,以允许自定义过滤ShareActionProvider建议。
唯一的更改是对ActivityChooserModel.loadActivitiesIfNeeded()方法的更改。在我的示例中,我希望过滤掉YouTube包。
https://github.com/danghiskhan/FilteredShareActionProvider处的代码
yyhrrdl86#
此解决方案基于此帖子https://rogerkeays.com/how-to-remove-the-facebook-android-sharing-intent