从android中的IntentChooser删除应用程序

从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

我有一个android应用程序,可以打开特定的URL。因此,在我的清单中,我添加了如下意图过滤器部分:

<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”);我已经用这个方法创建了最终的意图列表