以编程方式禁用来自Android清单的意图过滤器

问题描述 投票:7回答:4

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

 <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()用作其他选项,并且这样实现。

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中

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

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

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

android android-intent webview copy-paste long-press
4个回答
11
投票

您可以使用“活动别名”来执行此操作(通过编程方式从android清单中禁用意图过滤器:

1)将AndroidManifest.xml中的(例如AliasMySocialNetworkActivity)添加到MySocialNetworkActivity中,然后将意图过滤器移至其中。看起来像这样:


2
投票

就我而言,


1
投票
我实现了这一目标,但是将我的应用升级到棉花糖支持时遇到了问题。

0
投票
@ Andrii Omelchenko的回答是正确的,但是我想补充一点,如果您在build.gradle中使用applicationIdSuffix参数作为构建类型(例如,“。debug”后缀用于调试变量)或构建风味,它将赢得无法工作,因为无法在代码中找到您的组件。
© www.soinside.com 2019 - 2024. All rights reserved.