以编程方式从 android manifest 禁用意图过滤器 [英] disable the intent filter from android manifest programmatically

查看:24
本文介绍了以编程方式从 android manifest 禁用意图过滤器的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

在我的活动中,我有一个网络视图,在 manifest.xml 中,我已经声明了这样的意图过滤器

In my activity I have a web view and in manifest.xml I have declared intent filter like this

 <activity
        android:name=".ui.socialNetwork.MySocialNetworkActivity"
        android:configChanges="orientation|screenSize"
        android:process=":fb"
        android:screenOrientation="portrait" >

    </activity>

    <activity-alias
        android:targetActivity=".ui.socialNetwork.MySocialNetworkActivity"
        android:name=".AliasMySocialNetworkActivity"
        android:label="@string/app_name">
        <intent-filter>
            <action android:name="android.intent.action.PROCESS_TEXT" />
            <category android:name="android.intent.category.DEFAULT" />
            <data android:mimeType="text/plain" />
        </intent-filter>
    </activity-alias>

这不是启动器活动.此处使用的意图过滤器用于长按 Web 视图上的复制粘贴工具栏.这工作正常.除此之外,我想使用 Webview.setOnLongClickListener() 作为其他选项,我是这样实现的.

This is not launcher activity. The intent filter used here is for copy paste toolbar on web view long press. This works fine. In addition to this I want to use Webview.setOnLongClickListener() for additional options, and I implemented like this.

webView = (WebView) findViewById(R.id.webview);

PackageManager pm = getApplicationContext().getPackageManager();
    ComponentName compName =
            new ComponentName(getPackageName(), getPackageName() + ".AliasMySocialNetworkActivity");
    pm.setComponentEnabledSetting(
            compName,
            PackageManager.COMPONENT_ENABLED_STATE_DISABLED,
            PackageManager.DONT_KILL_APP);

    webView.setOnLongClickListener(new View.OnLongClickListener() {
        public boolean onLongClick(View v) {
            WebView.HitTestResult hitResult = null;
            hitResult = webView.getHitTestResult();
            if (hitResult != null && hitResult.getExtra() != null) {
                final String hitRes = hitResult.getExtra();
                if (hitResult.getType() == WebView.HitTestResult.IMAGE_TYPE || hitResult.getType() == WebView.HitTestResult.SRC_IMAGE_ANCHOR_TYPE) {
                    Intent ImageSaveIntent = new Intent(getApplicationContext(), SaveImage.class);
                    ImageSaveIntent.putExtra("putImage", hitRes);
                    startActivity(ImageSaveIntent);
                }
                if (hitResult.getType() != WebView.HitTestResult.IMAGE_TYPE || hitResult.getType() != WebView.HitTestResult.SRC_IMAGE_ANCHOR_TYPE) {
                    PackageManager pm = getApplicationContext().getPackageManager();
                    ComponentName compName =
                            new ComponentName(getPackageName(), getPackageName() + ".AliasMySocialNetworkActivity");
                    pm.setComponentEnabledSetting(
                            compName,
                            PackageManager.COMPONENT_ENABLED_STATE_ENABLED,
                            PackageManager.DONT_KILL_APP);
                                       }
            }
            return true;
        }
    });

我的问题是

  1. 如果我在没有 webview.setOnLongClickListener() 的情况下单独使用意图过滤器,我可以在 webview 中复制粘贴文本

  1. If I use intent filter alone without webview.setOnLongClickListener(), I can copy paste the text in webview

如果我单独使用 webview.setOnLongClickListener(),我可以做我的其他选项并且它工作正常.

If I use webview.setOnLongClickListener() alone, I can do my additional options and it is working fine.

如果我同时实现了意图过滤器和 webview.setOnLongClickListener(),我就无法从 webview 复制粘贴文本.webview.setOnLongClickListener() 将正常工作.在这里我明白这两个功能都依赖于 longPress,但我希望两者一起工作.

If I implement both intent filter and webview.setOnLongClickListener(), I cannot copy paste the text from webview. webview.setOnLongClickListener() will work fine. Here I understood that both functionalities depends on longPress, But I want both to work together.

我搜索了 TextType 的 Webview.HitResult 选项,但它没有这样的选项.https://developer.android.com/reference/android/webkit/WebView.HitTestResult.html

I searched Webview.HitResult options for TextType, but it is not having such option. https://developer.android.com/reference/android/webkit/WebView.HitTestResult.html

推荐答案

您可以使用 Activity Alias 执行此操作(以编程方式从 android manifest 禁用 Intent 过滤器):

You can do this (disable the intent filter from android manifest programatically) by using Activity Alias:

1) 在 AndroidManifest.xml 中添加(例如 AliasMySocialNetworkActivity)到你的 MySocialNetworkActivity 并将你的意图过滤器移动到它们.它看起来像这样:

1) add (e.g. AliasMySocialNetworkActivity) in AndroidManifest.xml to your MySocialNetworkActivity and move your intent-filter to them. It will be looks like that:

         <activity-alias
            android:targetActivity=".MySocialNetworkActivity"
            android:name=".AliasMySocialNetworkActivity"
            android:label="@string/app_name">
            <intent-filter>
                <action android:name="android.intent.action.PROCESS_TEXT" />
                <category android:name="android.intent.category.DEFAULT" />
                <data android:mimeType="text/plain" />
             </intent-filter>
        </activity-alias>

2) 添加此代码以在您需要时抑制别名活动中的意图过滤器

2) add this code to suppress intent-filter in alias activity when You need that

PackageManager pm = getApplicationContext().getPackageManager();
        ComponentName compName =
                new ComponentName(getPackageName(), getPackageName() + ".AliasMySocialNetworkActivity");
        pm.setComponentEnabledSetting(
                compName,
                PackageManager.COMPONENT_ENABLED_STATE_DISABLED,
                PackageManager.DONT_KILL_APP);

3) 在需要时恢复意图过滤器:

3) restore intent-filter, when You need it:

PackageManager pm = getApplicationContext().getPackageManager();
    ComponentName compName =
            new ComponentName(getPackageName(), getPackageName() + ".AliasMySocialNetworkActivity");
    pm.setComponentEnabledSetting(
            compName,
            PackageManager.COMPONENT_ENABLED_STATE_ENABLED,
            PackageManager.DONT_KILL_APP);

有关详细信息,请参阅那个答案.

For more details see this or that answer.

更新

其实你不需要别名,只要使用PackageManager.COMPONENT_ENABLED_STATE_DISABLED/PackageManager.COMPONENT_ENABLED_STATE_ENABLED

Actually You don't need Alias, just use PackageManager.COMPONENT_ENABLED_STATE_DISABLED/PackageManager.COMPONENT_ENABLED_STATE_ENABLED

PackageManager pm = getApplicationContext().getPackageManager();
        ComponentName compName =
                new ComponentName(getPackageName(), getPackageName() + ".MySocialNetworkActivity");
        pm.setComponentEnabledSetting(
                compName,
                PackageManager.COMPONENT_ENABLED_STATE_ENABLED,
                PackageManager.DONT_KILL_APP);

直接针对您的活动.谢谢@pskink.

directly on your activity. Thanks @pskink.

这篇关于以编程方式从 android manifest 禁用意图过滤器的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆