disable the intent filter from android manifest programmatically

后端 未结 4 672
粉色の甜心
粉色の甜心 2020-12-16 22:27

In my activity I have a web view and in manifest.xml I have declared intent filter like this

 

        
相关标签:
4条回答
  • 2020-12-16 23:07

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

    0 讨论(0)
  • 2020-12-16 23:27

    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.

    0 讨论(0)
  • 2020-12-16 23:28

    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 full android:name, without the "." at the start. E.g. "MySocialNetworkActivity".
    • 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" />
      
    0 讨论(0)
  • 2020-12-16 23:29

    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.

    0 讨论(0)
提交回复
热议问题