根据安装的Android软件包名称自定义过滤意图选择器我想利用内置的意图选择器来显示自定义过滤的应用列表,供用户选择和启动。我知道如何获取已安装的软件包列表:final Intent myIntent = new Intent(android.content.Intent.ACTION_MAIN); List<ResolveInfo> resInfoList = getPackageManager().queryIntentActivities(myIntent, 0);此时,我想根据包名称中包含的特定字符串(或字符串的变体)过滤列表,我也可以弄清楚如何操作。但是这里我被卡住了。据我所知,Intent.createChooser()只需要一个目标Intent作为参数。我希望有一个重载基于包和类名或其他东西的意图列表。但我没有看到类似的东西。我在某处错过了吗?所以问题是,这可能与内置选择器有关,还是我必须使用AlertDialog Builder构建自己的选择器?我希望避免后者。提前致谢。
3 回答
潇潇雨雨
TA贡献1833条经验 获得超4个赞
选择器的唯一附加参数是Intent.EXTRA_INITIAL_INTENTS。它的描述是:
一个Parcelable []的Intent或LabeledIntent对象,使用putExtra(String,Parcelable [])设置其他活动,以便在向用户显示ACTION_CHOOSER时放置选项列表的前面。
我没有在Android源代码中找到任何方法从列表中排除其他活动,因此似乎无法使用选择器执行您想要执行的操作。
编辑:这很容易找到。只需检查ChooserActivity和ResolverActivity源代码即可。这些课程相当小。
POPMUISE
TA贡献1765条经验 获得超5个赞
我做了一个小修改,以获得您想要通过名称共享的应用程序列表。它几乎就是您已发布的内容,但添加的应用程序按名称共享
String[] nameOfAppsToShareWith = new String[] { "facebook", "twitter", "gmail" };String[] blacklist = new String[]{"com.any.package", "net.other.package"};// your share intentIntent intent = new Intent(Intent.ACTION_SEND);intent.setType("text/plain");intent.putExtra(Intent.EXTRA_TEXT, "some text");intent.putExtra(android.content.Intent.EXTRA_SUBJECT, "a subject");// ... anything else you want to add invoke custom chooserstartActivity(generateCustomChooserIntent(intent, blacklist));private Intent generateCustomChooserIntent(Intent prototype,
String[] forbiddenChoices)
{
List<Intent> targetedShareIntents = new ArrayList<Intent>();
List<HashMap<String, String>> intentMetaInfo = new ArrayList<HashMap<String, String>>();
Intent chooserIntent;
Intent dummy = new Intent(prototype.getAction());
dummy.setType(prototype.getType());
List<ResolveInfo> resInfo = getPackageManager().queryIntentActivities(dummy,0);
if (!resInfo.isEmpty())
{
for (ResolveInfo resolveInfo : resInfo)
{
if (resolveInfo.activityInfo == null
|| Arrays.asList(forbiddenChoices).contains(
resolveInfo.activityInfo.packageName))
continue;
//Get all the posible sharers
HashMap<String, String> info = new HashMap<String, String>();
info.put("packageName", resolveInfo.activityInfo.packageName);
info.put("className", resolveInfo.activityInfo.name);
String appName = String.valueOf(resolveInfo.activityInfo .loadLabel(getPackageManager()));
info.put("simpleName", appName);
//Add only what we want
if (Arrays.asList(nameOfAppsToShareWith).contains(
appName.toLowerCase()))
{
intentMetaInfo.add(info);
}
}
if (!intentMetaInfo.isEmpty())
{
// sorting for nice readability
Collections.sort(intentMetaInfo,
new Comparator<HashMap<String, String>>()
{
@Override public int compare(
HashMap<String, String> map,
HashMap<String, String> map2)
{
return map.get("simpleName").compareTo(
map2.get("simpleName"));
}
});
// create the custom intent list
for (HashMap<String, String> metaInfo : intentMetaInfo)
{
Intent targetedShareIntent = (Intent) prototype.clone();
targetedShareIntent.setPackage(metaInfo.get("packageName"));
targetedShareIntent.setClassName(
metaInfo.get("packageName"),
metaInfo.get("className"));
targetedShareIntents.add(targetedShareIntent);
}
String shareVia = getString(R.string.offer_share_via);
String shareTitle = shareVia.substring(0, 1).toUpperCase()
+ shareVia.substring(1);
chooserIntent = Intent.createChooser(targetedShareIntents .remove(targetedShareIntents.size() - 1), shareTitle);
chooserIntent.putExtra(Intent.EXTRA_INITIAL_INTENTS,
targetedShareIntents.toArray(new Parcelable[] {}));
return chooserIntent;
}
}
return Intent.createChooser(prototype,
getString(R.string.offer_share_via));
}它与Makibo发布的解决方案几乎相同,但只需添加一个名称即可轻松选择您想要分享的应用程序,以便在更改包名称或类似名称时不会有任何问题这个。只要他们不改名字。
- 3 回答
- 0 关注
- 793 浏览
添加回答
举报
0/150
提交
取消
