disable the intent filter from android manifest programmatically

android, android-intent, copy-paste, long-press, webview

Solution

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

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

Update

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

directly on your activity. Thanks @pskink.

Problem

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> ``` 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; } }); ``` My problem is that If I use intent filter alone without webview.setOnLongClickListener(), I can copy paste the text in webview If I use webview.setOnLongClickListener() alone, I can do my additional options and it is working fine. 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. I searched Webview.HitResult options for TextType, but it is not having such option. https://developer.android.com/reference/android/webkit/WebView.HitTestResult.html

Original source

Related problems