我有一个在 android list 中使用 ACTION_VIEW 操作设置为默认 Activity 的 Activity ,我想让 Activity 接收到我的应用程序的 http、https 等 url 类型的方案。看下面的代码
<activity
android:name="com.test.ui.LinkLauncherActivity"
android:label="@string/app_name"
android:excludeFromRecents="true"
android:screenOrientation="portrait"
android:theme="@android:style/Theme.NoDisplay">
<intent-filter>
<action android:name="android.intent.action.VIEW" />
<category android:name="android.intent.category.DEFAULT" />
<category android:name="android.intent.category.BROWSABLE" />
<data android:scheme="http" />
<data android:scheme="https"/>
</intent-filter>
</activity>
现在在我的应用程序中,我可以选择共享链接,为此我 想用选定的应用程序打开选择 Intent 应该只 选择对话框中列出的排除我自己的应用程序。
目前,当我使用操作查询包管理器时 (ACTION_VIEW) 它将返回我在其中的应用程序列表 找到我的包裹名称我只是忽略它并打开选择 Intent 但是 它仍然在自定义共享意向对话框中显示我的应用程序。
是不是因为我在 list 中将类别定义为默认类别,如您在上面的代码中所见?
让我们分享自定义 Intent 代码
Uri uriUrl = Uri.parse(mlm.getHitUrl()); //get package manager PackageManager pm = getPackageManager(); Intent viewIntent = new Intent(Intent.ACTION_VIEW,uriUrl); List<ResolveInfo> resInfo = pm.queryIntentActivities(viewIntent, 0); List<LabeledIntent> intentList = new ArrayList<LabeledIntent>(resInfo.size() - 1); for (int i = 0; i < resInfo.size(); i++) { // Extract the label, append it, and repackage it in a LabeledIntent ResolveInfo ri = resInfo.get(i); String packageName = ri.activityInfo.packageName; Log.d(getTag(),String.format("PackageName : %2s",packageName)); if (!TextUtils.equals(packageName,"my application packageName")) { Intent intent = new Intent(Intent.ACTION_VIEW,uriUrl); intent.setPackage(packageName); intentList.add(new LabeledIntent(intent, packageName, ri.loadLabel(pm), ri.icon)); } } // convert intentList to array LabeledIntent[] extraIntents = intentList.toArray( new LabeledIntent[ intentList.size() ]); Intent openInChooser = Intent.createChooser(viewIntent, getResources().getString(R.string.intent_title_open_link)); openInChooser.putExtra(Intent.EXTRA_INITIAL_INTENTS, extraIntents); openInChooser.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK); startActivity(openInChooser);
上面的代码仍然显示了我在 Intent 对话框中的应用程序。
最佳答案
试试这段代码。
Intent intent = new Intent();
intent.setAction(android.content.Intent.ACTION_VIEW);
MimeTypeMap mime = MimeTypeMap.getSingleton();
String ext = file.getName().substring(file.getName().indexOf(".")+1);
String type = mime.getMimeTypeFromExtension(ext);
intent.setDataAndType(Uri.fromFile(file),type);
PackageManager packageManager = activity.getPackageManager();
List<ResolveInfo> activities = packageManager.queryIntentActivities(intent, 0);
String packageNameOfAppToHide = "com.test.app";
ArrayList<Intent> targetIntents = new ArrayList<Intent>();
for (ResolveInfo currentInfo : activities) {
String packageName = currentInfo.activityInfo.packageName;
if (packageNameToHide.equals(packageName)) {
Intent targetIntent = new Intent(android.content.Intent.ACTION_VIEW);
targetIntent.setDataAndType(Uri.fromFile(file),type);
targetIntent.setPackage(packageName);
targetIntents.add(targetIntent);
}
}
if(targetIntents.size()>0) {
Intent chooserIntent = Intent.createChooser(targetIntents.remove(0), "Open file with");
chooserIntent.putExtra(Intent.EXTRA_INITIAL_INTENTS, targetIntents.toArray(new Parcelable[] {}));
activity.startActivity(chooserIntent);
}
else
Toast.makeText(this, "No app found", Toast.LENGTH_SHORT).show();
其中 com.test.app 是您的应用程序的包名称。
关于android - 自定义选择 Intent 排除我自己的 Activity ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24075319/