该应用程序具有意图过滤器,可通过ACTION_SEND意图在其他应用程序的共享菜单中显示。 应用程序本身也使用ACTION_SEND和createChooser()具有共享菜单,并且我的应用程序出现在列表中。 由于它们已经在我的应用程序中,因此似乎奇怪它们能够分享回自己。
如果从我的应用程序中调用该应用程序,是否有一种方法可以使其不出现在列表中?
如果从我的应用程序中调用该应用程序,是否有一种方法可以使其不出现在列表中?
以下是你的解决方案。如果你想排除自己的应用程序,你可以使用ctx.getPackageName()替换“packageNameToExclude”。
public static Intent shareExludingApp(Context ctx, String packageNameToExclude, String imagePath, String text) {
List<Intent> targetedShareIntents = new ArrayList<Intent>();
Intent share = new Intent(android.content.Intent.ACTION_SEND);
share.setType("image/*");
List<ResolveInfo> resInfo = ctx.getPackageManager().queryIntentActivities(createShareIntent(text,new File(imagePath)), 0);
if (!resInfo.isEmpty()) {
for (ResolveInfo info : resInfo) {
Intent targetedShare = createShareIntent(text,new File(imagePath));
if (!info.activityInfo.packageName.equalsIgnoreCase(packageNameToExclude)) {
targetedShare.setPackage(info.activityInfo.packageName);
targetedShareIntents.add(targetedShare);
}
}
Intent chooserIntent = Intent.createChooser(targetedShareIntents.remove(0),
"Select app to share");
chooserIntent.putExtra(Intent.EXTRA_INITIAL_INTENTS,
targetedShareIntents.toArray(new Parcelable[] {}));
return chooserIntent;
}
return null;
}
private static Intent createShareIntent(String text, File file) {
Intent share = new Intent(android.content.Intent.ACTION_SEND);
share.setType("image/*");
if (text != null) {
share.putExtra(Intent.EXTRA_TEXT, text);
}
share.putExtra(Intent.EXTRA_STREAM, Uri.fromFile(file));
return share;
}
如果我的应用程序从自己的应用程序中调用,有没有办法使其不出现在列表中?
不能通过createChooser()
实现。但是,您可以通过PackageManager
和queryIntentActivities()
创建自己的类似于chooser的对话框,并通过筛选自己来达到目的。
AlertDialog.Builder
和 setAdapter()
)。PackageManager
可以提供图标。请参见 http://github.com/commonsguy/cw-advandroid/tree/master/Introspection/Launchalot/。 - CommonsWare。
Intent chooserIntent = Intent.createChooser(new Intent(), "Select app to share");
已在此处回答 - https://dev59.com/NVoT5IYBdhLWcg3wngu1#74131607
将targetSdkVersion更新为31后,旧解决方案将停止工作。下面的解决方案适用于所有Android版本。
在Manifest文件AndroidManidest.xml中
(在Android api 31中,默认情况下queryIntentActivities()将返回空列表,为了从queryIntentActivities获取所需的结果,您需要在清单文件中添加以下查询参数。)
<manifest>
<queries>
<intent>
<!--Change the action and data depending on you share intent-->
<action android:name="android.intent.action.SEND" />
<data android:mimeType="text/*"/>
</intent>
</queries>
</manifest>
在活动文件分享功能中
Intent shareIntent = new Intent();
shareIntent.setAction(Intent.ACTION_SEND);
shareIntent.setType("text/plain");
shareIntent.putExtra(Intent.EXTRA_TEXT, "Link");
shareIntent.putExtra(Intent.EXTRA_SUBJECT,"Description")
ArrayList<ComponentName> excludedComponents = new ArrayList<ComponentName>();
PackageManager packageManager = context.getPackageManager();
for (ResolveInfo resolveInfo : packageManager.queryIntentActivities(shareIntent, 0)){
String packageName = resolveInfo.activityInfo.packageName;
//change facebook with whichever app you want to exclude or you can directly search for the specific package name
if (packageName.contains("facebook")){
excludedComponents.add(new
ComponentName(packageName,resolveInfo.activityInfo.name));
}
}
Intent intentChooser = Intent.createChooser(shareIntent, "Share");
intentChooser.putExtra(Intent.EXTRA_EXCLUDE_COMPONENTS, excludedComponents.toArray(new Parcelable[]{}));
startActivity(intentChooser);