从android中的IntentChooser删除应用程序
我有一个android应用程序,可以打开特定的URL。因此,在我的清单中,我添加了如下意图过滤器部分:从android中的IntentChooser删除应用程序,android,android-intent,intentfilter,Android,Android Intent,Intentfilter,我有一个android应用程序,可以打开特定的URL。因此,在我的清单中,我添加了如下意图过滤器部分: <intent-filter> <data andriod:host="someurl.com"/> <category android:name="android.intent.category.DEFAULT" /> <category android:name="android.intent.category.BROWSA
<intent-filter>
<data andriod:host="someurl.com"/>
<category android:name="android.intent.category.DEFAULT" />
<category android:name="android.intent.category.BROWSABLE" />
<action android:name="android.intent.action.VIEW" />
</intent-filter>
当用户点击我的链接(在应用程序之外)时,我的应用程序显示为可以打开url的应用程序之一,这很好
但我的应用程序中有以“someurl.com”开头的链接,在这种情况下,我应该从IntentChooser对话框中删除我的应用程序。我是这样做的:
public Intent generateCustomChooserIntent(Intent prototype) throws Exception {
List<Intent> targetedShareIntents = new ArrayList<Intent>();
List<ResolveInfo> resInfo = getPackageManager().queryIntentActivities(prototype, 0);
if (!resInfo.isEmpty()) {
for (ResolveInfo resolveInfo : resInfo) {
// do not include my app in intent chooser dialog
if (resolveInfo.activityInfo == null || resolveInfo.activityInfo.packageName.equals(getPackageName())) {
continue;
}
// add Intent to intent chooser dialog
Intent targetedShareIntent = (Intent) prototype.clone();
targetedShareIntent.setPackage(resolveInfo.activityInfo.packageName);
targetedShareIntent.setClassName(resolveInfo.activityInfo.packageName, resolveInfo.activityInfo.name);
targetedShareIntents.add(targetedShareIntent);
}
if (!targetedShareIntents.isEmpty()) {
// pass new Intent to create no chooser in first row
Intent chooserIntent = Intent.createChooser(targetedShareIntents.get(0), getString(R.string.open_link_with));
targetedShareIntents.remove(0);
// pass extra intent chooser
chooserIntent.putExtra(Intent.EXTRA_INITIAL_INTENTS, targetedShareIntents.toArray(new Parcelable[targetedShareIntents.size()]));
return chooserIntent;
}
}
// there is no appropriate intent to run
throw new Exception();
}
public Intent generatecustomchooserint(Intent原型)引发异常{
List targetedShareContents=new ArrayList();
List resInfo=getPackageManager().queryInputActivities(原型,0);
如果(!resInfo.isEmpty()){
对于(ResolveInfo ResolveInfo:resInfo){
//不要在“意向选择器”对话框中包含我的应用
if(resolveInfo.activityInfo==null | | resolveInfo.activityInfo.packageName.equals(getPackageName()){
继续;
}
//将意图添加到“意图选择器”对话框
Intent targetedShareContent=(Intent)prototype.clone();
targetedShareContent.setPackage(resolveInfo.activityInfo.packageName);
targetedShareContent.setClassName(resolveInfo.activityInfo.packageName,resolveInfo.activityInfo.name);
targetedShareIntents.add(targetedShareIntent);
}
如果(!targetedShareContents.isEmpty()){
//传递新意图以在第一行中不创建选择器
Intent chooserecontent=Intent.createChooser(targetedShareContents.get(0),getString(R.string.open_link_with));
目标共享内容。删除(0);
//传递额外意图选择器
选择content.putExtra(Intent.EXTRA\u INITIAL\u INTENTS,targetedShareContents.toArray(新包裹[targetedShareContents.size()]);
返回选择器内容;
}
}
//没有适当的运行意图
抛出新异常();
}
而且也很好
但在一些安卓设备(如三星A5 2016)中,当我询问可以处理url的意图时,它只返回我的应用程序作为适当的应用程序(不包括谷歌chrome之类的应用程序),然后我从IntentChooser对话框中删除我的应用程序,然后没有任何选择
我如何解决这个问题?有一种解决方法,您可以这样使用
public Intent generateCustomChooserIntent(Context context, String url) throws Exception {
Uri fakeUri = Uri.parse("https://www.google.com");
Uri realUri = Uri.parse(url);
Intent shareIntent = new Intent(Intent.ACTION_VIEW, fakeUri);
List<ResolveInfo> resInfo;
if (android.os.Build.VERSION.SDK_INT >= android.os.Build.VERSION_CODES.M) {
resInfo = context.getPackageManager().queryIntentActivities(
shareIntent, PackageManager.MATCH_ALL);
} else {
resInfo = context.getPackageManager().queryIntentActivities(
shareIntent, 0);
}
if (!resInfo.isEmpty()) {
List<Intent> targetedShareIntents = removeCurrentApp(context, realUri, resInfo);
if (!targetedShareIntents.isEmpty()) {
// pass new Intent to create no chooser in first row
Intent chooserIntent = Intent.createChooser(
targetedShareIntents.get(0), context.getString(R.string.open_link_with));
targetedShareIntents.remove(0);
// pass extra intent chooser
chooserIntent.putExtra(
Intent.EXTRA_INITIAL_INTENTS,
targetedShareIntents.toArray(new Parcelable[targetedShareIntents.size()]));
return chooserIntent;
}
}
// there is no appropriate intent to run
throw new Exception();
}
@NonNull
private List<Intent> removeCurrentApp(Context context, Uri realUri, List<ResolveInfo> resInfo) {
List<Intent> targetedShareIntents = new ArrayList<>();
String currentPackageName = context.getPackageName();
for (ResolveInfo resolveInfo : resInfo) {
// do not include my app in intent chooser dialog
if (resolveInfo.activityInfo == null) {
continue;
}
String packageName = resolveInfo.activityInfo.packageName;
if (currentPackageName.equalsIgnoreCase(packageName)) {
continue;
}
Intent intent = new Intent(Intent.ACTION_VIEW, realUri);
intent.setClassName(
resolveInfo.activityInfo.applicationInfo.packageName,
resolveInfo.activityInfo.name);
intent.setPackage(packageName);
targetedShareIntents.add(intent);
}
return targetedShareIntents;
}
public Intent generatecustomchooserint(上下文、字符串url)引发异常{
Uri fakeUri=Uri.parse(“https://www.google.com");
urirealuri=Uri.parse(url);
意向共享意向=新意向(Intent.ACTION\u视图,fakeUri);
列表resInfo;
if(android.os.Build.VERSION.SDK\u INT>=android.os.Build.VERSION\u code.M){
resInfo=context.getPackageManager().QueryInputActivities(
shareIntent、PackageManager.MATCH_ALL);
}否则{
resInfo=context.getPackageManager().QueryInputActivities(
共享意图,0);
}
如果(!resInfo.isEmpty()){
List targetedShareContents=removeCurrentApp(上下文、realUri、resInfo);
如果(!targetedShareContents.isEmpty()){
//传递新意图以在第一行中不创建选择器
Intent-chooserint=Intent.createChooser(
targetedShareContents.get(0),context.getString(R.string.open_link_with));
目标共享内容。删除(0);
//传递额外意图选择器
选择内容(
意图。额外的最初意图,
targetedShareContents.toArray(新的可包裹[targetedShareContents.size()]);
返回选择器内容;
}
}
//没有适当的运行意图
抛出新异常();
}
@非空
私有列表removeCurrentApp(上下文上下文、Uri realUri、列表resInfo){
List targetedShareContents=new ArrayList();
字符串currentPackageName=context.getPackageName();
对于(ResolveInfo ResolveInfo:resInfo){
//不要在“意向选择器”对话框中包含我的应用
if(resolveInfo.activityInfo==null){
继续;
}
字符串packageName=resolveInfo.activityInfo.packageName;
if(当前packageName.equalsIgnoreCase(packageName)){
继续;
}
意图=新意图(Intent.ACTION\u视图,realUri);
intent.setClassName(
resolveInfo.activityInfo.applicationInfo.packageName,
resolveInfo.activityInfo.name);
intent.setPackage(packageName);
targetedShareContents.add(意图);
}
返回目标共享内容;
}
为查询活动尝试了不同的标志
?关于resolveInfo.activityInfo.packageName
,您的调试会话说了些什么?当我看到这一行时:List resInfo=getPackageManager().querytentActivities(prototype,0);大多数设备返回所有可以处理url的意图,但在某些设备中,它只是我的应用程序,而不是其他。不同的旗帜是什么意思?你是说有什么特别的标志吗?你确定Intent prototype
的格式正确吗?也许“所有其他设备”
报告了错误的意图列表?以下是我的原型意图:意图原型=新意图(intent.ACTION\u视图);setData(Uri.parse(“someurl.com”);我已经用这个方法创建了最终的意图列表