以编程方式从android清单中禁用intent过滤器

Pra*_*mar 7 android copy-paste webview android-intent long-press

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

 <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>
Run Code Online (Sandbox Code Playgroud)

这不是发射器活动.这里使用的intent过滤器用于Web视图上的复制粘贴工具栏长按.这很好用.除此之外,我想使用Webview.setOnLongClickListener()获取其他选项,我实现了这样.

  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;
        }
    });
Run Code Online (Sandbox Code Playgroud)

我的问题是

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

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

  3. 如果我实现了intent过滤器和webview.setOnLongClickListener(),我无法从webview复制粘贴文本.webview.setOnLongClickListener()将正常工作.在这里我理解这两个功能都取决于longPress,但我希望两者一起工作.

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

请帮我解决这个问题.

And*_*nko 10

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

1)将AndroidManifest.xml中的(例如AliasMySocialNetworkActivity)添加到MySocialNetworkActivity并将intent-filter移动到它们.它看起来像那样:

         <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>
Run Code Online (Sandbox Code Playgroud)

2)添加此代码以在需要时抑制别名活动中的intent-filter

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

3)在需要时恢复intent-filter:

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

欲了解更多详情,请参阅那个答案.

更新

其实你不需要Alias,只需使用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);
Run Code Online (Sandbox Code Playgroud)

直接对你的活动.谢谢@pskink.