android - 以编程方式禁用 android list 中的 Intent 过滤器

标签 android android-intent webview copy-paste long-press

在我的 Activity 中,我有一个 WebView ,在 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>

这不是启动器 Activity 。 此处使用的 Intent 过滤器用于在 Web View 长按时复制粘贴工具栏。这很好用。 除此之外,我想使用 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;
        }
    });

我的问题是

  1. 如果我单独使用 intent 过滤器而不使用 webview.setOnLongClickListener(),我可以在 webview 中复制粘贴文本

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

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

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

最佳答案

您可以使用 Activity Alias 执行此操作(以编程方式禁用 android list 中的 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>

2) 添加此代码以在需要时抑制别名 Activity 中的 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);

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);

有关详细信息,请参阅 thisthat回答。

更新

其实你不需要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);

直接针对您的 Activity 。谢谢@pskink。

关于android - 以编程方式禁用 android list 中的 Intent 过滤器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40505357/

相关文章:

android - 无法在设备上运行应用程序,android

android - 通过 WhatsApp 按 Intent 发送消息

javascript - WebView 上传照片不起作用 - AndroidX

android - WebView 下一页/上一页转换

android - 是否可以多次激发一个 Intent ?

Android WebView资源文件如js和css文件缓存

android - gradle android 插件和构建类型源集的问题

android - 影响 Android Maps TileProvider 中的 Tile 大小?

Android - 如何将 View 的 x 和 y 坐标放入 gridLayout 中?

android - 如何通过多个 Activity 返回结果