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