执行隐式意图时仅显示特定选项
Show only specific options when doing Implicit Intent
对不起,如果这个问题已经被问过了,我搜索了很多但没有找到。
我的疑问是,当我进行隐含的共享意图时 image/test 它向我显示了各种选项,例如 WhatsApp、Facebook、Message 等。但是我只想显示 2 个选项,例如Whatsapp 和消息。
对于 WhatsApp,我知道该软件包,但我不知道对于移动设备中的 Message 应用程序。
所以,
- 消息应用有默认包名吗?
- 如何在隐式意图中包含 2 个包?
提前致谢
你可以试试这个
Intent intent = new Intent(Intent.ACTION_MAIN);
intent.addCategory(Intent.CATEGORY_APP_MESSAGING);
intent.addCategory(Intent.CATEGORY_APP_BROWSER)
startActivity(intent);
问题 1 的答案:
使用此方法查找默认包。
public static String getDefaultSmsAppPackageName(Context context) {
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT)
return Telephony.Sms.getDefaultSmsPackage(context);
else {
Intent intent = new Intent(Intent.ACTION_VIEW)
.addCategory(Intent.CATEGORY_DEFAULT).setType("vnd.android-dir/mms-sms");
final List<ResolveInfo> resolveInfos = context.getPackageManager().queryIntentActivities(intent, 0);
if (resolveInfos != null && !resolveInfos.isEmpty())
return resolveInfos.get(0).activityInfo.packageName;
return null;
}
}
问题 2 的答案:
List<Intent> targetedShareIntents = new ArrayList<Intent>();
Intent shareIntent = new Intent(android.content.Intent.ACTION_SEND);
shareIntent.setType("text/plain");
List<ResolveInfo> resInfo = getPackageManager().queryIntentActivities(shareIntent, 0);
if (!resInfo.isEmpty()) {
for (ResolveInfo resolveInfo : resInfo) {
String packageName = resolveInfo.activityInfo.packageName;
Intent targetedShareIntent = new Intent(android.content.Intent.ACTION_SEND);
targetedShareIntent.setType("text/plain");
targetedShareIntent.putExtra(android.content.Intent.EXTRA_TEXT, "text message to shared");
targetedShareIntent.putExtra(android.content.Intent.EXTRA_SUBJECT, "subject to be shared");
if (packageName.contains(getDefaultSmsAppPackageName(context))||packageName.contains("com.whatsapp")) {
targetedShareIntent.setPackage(packageName);
targetedShareIntents.add(targetedShareIntent);
}
}
Intent chooserIntent = Intent.createChooser(targetedShareIntents.remove(0), "Select app to share");
chooserIntent.putExtra(Intent.EXTRA_INITIAL_INTENTS, targetedShareIntents.toArray(new Parcelable[targetedShareIntents.size()]));
startActivity(chooserIntent);
对不起,如果这个问题已经被问过了,我搜索了很多但没有找到。
我的疑问是,当我进行隐含的共享意图时 image/test 它向我显示了各种选项,例如 WhatsApp、Facebook、Message 等。但是我只想显示 2 个选项,例如Whatsapp 和消息。
对于 WhatsApp,我知道该软件包,但我不知道对于移动设备中的 Message 应用程序。
所以,
- 消息应用有默认包名吗?
- 如何在隐式意图中包含 2 个包?
提前致谢
你可以试试这个
Intent intent = new Intent(Intent.ACTION_MAIN);
intent.addCategory(Intent.CATEGORY_APP_MESSAGING);
intent.addCategory(Intent.CATEGORY_APP_BROWSER)
startActivity(intent);
问题 1 的答案:
使用此方法查找默认包。
public static String getDefaultSmsAppPackageName(Context context) {
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT)
return Telephony.Sms.getDefaultSmsPackage(context);
else {
Intent intent = new Intent(Intent.ACTION_VIEW)
.addCategory(Intent.CATEGORY_DEFAULT).setType("vnd.android-dir/mms-sms");
final List<ResolveInfo> resolveInfos = context.getPackageManager().queryIntentActivities(intent, 0);
if (resolveInfos != null && !resolveInfos.isEmpty())
return resolveInfos.get(0).activityInfo.packageName;
return null;
}
}
问题 2 的答案:
List<Intent> targetedShareIntents = new ArrayList<Intent>();
Intent shareIntent = new Intent(android.content.Intent.ACTION_SEND);
shareIntent.setType("text/plain");
List<ResolveInfo> resInfo = getPackageManager().queryIntentActivities(shareIntent, 0);
if (!resInfo.isEmpty()) {
for (ResolveInfo resolveInfo : resInfo) {
String packageName = resolveInfo.activityInfo.packageName;
Intent targetedShareIntent = new Intent(android.content.Intent.ACTION_SEND);
targetedShareIntent.setType("text/plain");
targetedShareIntent.putExtra(android.content.Intent.EXTRA_TEXT, "text message to shared");
targetedShareIntent.putExtra(android.content.Intent.EXTRA_SUBJECT, "subject to be shared");
if (packageName.contains(getDefaultSmsAppPackageName(context))||packageName.contains("com.whatsapp")) {
targetedShareIntent.setPackage(packageName);
targetedShareIntents.add(targetedShareIntent);
}
}
Intent chooserIntent = Intent.createChooser(targetedShareIntents.remove(0), "Select app to share");
chooserIntent.putExtra(Intent.EXTRA_INITIAL_INTENTS, targetedShareIntents.toArray(new Parcelable[targetedShareIntents.size()]));
startActivity(chooserIntent);