In my activity I have a web view and in manifest.xml I have declared intent filter like this
This i achieved but faced issues when upgraded my app to Marshmallow support.
Dynamically you can't remove the IntentFilter from the Manifest Components.
If you are working on Marmalade/Native languages like C & C++(NDK), You can achieve disable the IntentFilter components but after platform upgrade(like Kitkat to LollyPop) it gives problem.
This changes is not recommended by android community in any of the developer.android.com pages.
One Solution could be,
String packageName = getPackageName();
try {
PackageInfo p = getApplicationContext().getPackageManager().getPackageInfo(packageName, PackageManager.GET_ACTIVITIES);
for (ActivityInfo activityInfo : p.activities) {
if(log.d()) log.d("ACT " + activityInfo.name+" "+activityInfo.packageName);
}
} catch (PackageManager.NameNotFoundException e) {
e.printStackTrace();
}
Go with alias from the code "alias"
ComponentName componentWithoutTextFiles = new ComponentName(packageName, packageName".alias");
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.
Answer from @Andrii Omelchenko is correct, but I'd like to add that if you use applicationIdSuffix
parameter in build.gradle for your build type (e.g. ".debug" suffix for debug variant) or build flavor, it won't work as it won't find your component in code.
Problem is that when you specify:
<activity-alias
android:targetActivity=".MySocialNetworkActivity"
android:name=".AliasMySocialNetworkActivity" />
See the dot "." at the start of the name - Android will prepend this with the package name of your app, without the applicationIdSuffix
, so you will get e.g. com.example.packagename
, but in code, context.getPackageName()
will return package name with the applicationIdSuffix
! So it won't find the component in that case.
There are two solutions:
Specify the packagename prefix with the variable "${applicationId}
which contains the applied applicationIdSuffix
(it is automatically available in manifest file):
<activity-alias
android:targetActivity=".MySocialNetworkActivity"
android:name="${applicationId}.AliasMySocialNetworkActivity" />
In my case,
Code in AndroidManifest.xml
<activity-alias
android:name="alias.Shortcut"
android:icon="@drawable/shortcut_icon"
android:label="@string/shortcut_text"
android:targetActivity="com.myexample.shortcutexample.ShortcutActivity">
<intent-filter>
<action android:name="android.intent.action.CREATE_SHORTCUT" />
<category android:name="android.intent.category.DEFAULT" />
</intent-filter>
</activity-alias>
Code to disable alias
PackageManager pm = getApplicationContext().getPackageManager();
ComponentName compName =
new ComponentName(getPackageName(), getPackageName() + ".alias.Shortcut");
pm.setComponentEnabledSetting(
compName,
PackageManager.COMPONENT_ENABLED_STATE_DISABLED,
PackageManager.DONT_KILL_APP);
when I tried
getPackageName() + ".alias.Shortcut"
I got java.lang.IllegalArgumentException: Component class com.myexample.shortcutexample.alias.Shortcut does not exist in com.myexample.shortcutexample
So I changed my code to
ComponentName compName =
new ComponentName(getPackageName(), "alias.Shortcut");
and it worked like charm.