Как программно отключить определенный Intent-фильтр в Android? - PullRequest
0 голосов
/ 06 октября 2019

У меня есть SplashScreen с 3-мя Intent-фильтрами, определенными в Manifest следующим образом -

<activity
            android:name=".SplashScreen"
            android:screenOrientation="portrait"
            android:theme="@style/SplashTheme"
            android:windowSoftInputMode="stateAlwaysHidden">
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />

                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
            <intent-filter>
                <action android:name="android.intent.action.VIEW" />

                <category android:name="android.intent.category.DEFAULT" />
                <category android:name="android.intent.category.BROWSABLE" />

                <data
                    android:host="kljb"
                    android:scheme="http" />
                <data
                    android:host="kljb"
                    android:scheme="https" />
            </intent-filter>
<intent-filter>
                <action android:name="android.intent.action.VIEW" />

                <category android:name="android.intent.category.DEFAULT" />
                <category android:name="android.intent.category.BROWSABLE" />
                <!-- Accepts URIs that begin with "http://www.example.com/gizmos” -->
                <data
                    android:host="xyz"
                    android:scheme="abc" />
            </intent-filter>
        </activity>

Я хочу отключить этот -

                <category android:name="android.intent.category.DEFAULT" />
                <category android:name="android.intent.category.BROWSABLE" />
                <!-- Accepts URIs that begin with "http://www.example.com/gizmos” -->
                <data
                    android:host="xyz"
                    android:scheme="abc" />
            </intent-filter>

ИПосле некоторого действия пользователя я хочу включить его.

Я пытался использовать -

PackageManager pm = getApplicationContext().getPackageManager();
        ComponentName compName =
                new ComponentName(getPackageName(), ".SplashScreen");
        pm.setComponentEnabledSetting(
                compName,
                PackageManager.COMPONENT_ENABLED_STATE_DISABLED,
                PackageManager.DONT_KILL_APP);

Я не знаю точно, где написать этот код выше. Я установил этот код при создании SplashScreen, но получил ошибку -

Невозможно запустить действие ComponentInfo java.lang.SecurityException: попытка изменить состояние компонента;

Я знаю, что этот вопрос несколько раз задавался на SO, но ни один из них не касается того, где написать этот код.

После предложения Commonsware:

Я сделал псевдоним -

<activity-alias
            android:name=".SplashScreen"
            android:screenOrientation="portrait"
            android:targetActivity=".SplashScreen"
            android:theme="@style/SplashTheme"
            android:windowSoftInputMode="stateAlwaysHidden">

            <intent-filter>
                <action android:name="android.intent.action.VIEW" />

                <category android:name="android.intent.category.DEFAULT" />
                <category android:name="android.intent.category.BROWSABLE" />
                <!-- Accepts URIs that begin with "http://www.example.com/gizmos” -->
                <data
                    android:host="xyz"
                    android:scheme="abc" />
            </intent-filter>

        </activity-alias>

Итак, я вызываю код в oncreate () MainActivity, который открывается после SplashScreen -

2019-10-06 04: 49: 52.578 23014-23014 / com. khaalijeb.inkdrops.debug E / AndroidRuntime: ИСКЛЮЧИТЕЛЬНОЕ ИСКЛЮЧЕНИЕ: основной процесс: com.khaalijeb.inkdrops.debug, PID: 23014 java.lang.RuntimeException: Невозможно запустить действие ComponentInfo {com.khaalijeb.inkdrops.debug / com.kha. inkdrops.MainActivity}: java.lang.SecurityException: попытка изменить состояние компонента;pid = 23014, uid = 10262, component = com.khaalijeb.inkdrops / .SplashScreen на android.app.ActivityThread.performLaunchActivity (ActivityThread.java:3270) на android.app.ActivityThread.handleLaunchActivity (ActivityThread.java:3409) в и.app. android.app.ActivityThread $ H.handleMessage (ActivityThread.java:2016) в android.os.Handler.dispatchMessage (Handler.java:107) в android.os.Looper.loop (Looper.java:214) в android.app.ActivityThread.main (ActivityThread.java:7356) в java.lang.reflect.Method.invoke (собственный метод) в com.android.internal.os.RuntimeInit $ MethodAndArgsCaller.run (RuntimeInit.java:492) в com.android.internal.os.ZygoteInit.main (ZygoteInit.java:930) Причина: java.lang.SecurityException: Попытка изменить компонент государство;pid = 23014, uid = 10262, component = com.khaalijeb.inkdrops / .SplashScreen на android.os.Parcel.createException (Parcel.java:2071) на android.os.Parcel.readException (Parcel.java:2039) на андроиде.os. com.khaalijeb.inkdrops.MainActivity.onCreate (MainActivity.java:1604) на android.app.Activity.performCreate (Activity.java:7802) на android.app.Activity.performCreate (Activity.java:7791) на android.app.Instrumentation.callActivityOnCreate (Instrumentation.java:1306) при android.app.ActivityThread.performLaunchActivity (ActivityThread.java:3245) в android.app.ActivityThread.handleLaunchActivity (ActivityThread.java:3409) в android.app.servertransaction.LaunchActivityItem. выполнить (LaunchActivityItem.java:83) в android.app.servertransaction.TransactionExecutor.executeCallbacks (TransactionExecutor.java:135) в android.app.servertransaction.TransactionExecutor.execute (TransactionExecutor.java:95) в android.app.ActivityThread $ H.handleMessage (ActivityThread.java:2016) в android.os.Handler. dispatchMessage (Handler.java:107) на android.os.Looper.loop (Looper.java:214) на android.app.ActivityThread.main (ActivityThread.java:7356)на java.lang.reflect.Method.invoke (собственный метод) на com.android.internal.os.RuntimeInit $ MethodAndArgsCaller.run (RuntimeInit.java:492) на com.android.internal.os.ZygoteInit.main (ZygoteInit. java: 930) Причина: android.os.RemoteException: трассировка удаленного стека: в com.android.server.pm.PackageManagerService.setEnabledSetting (PackageManagerService.java:21250) в com.android.server.pm.PackageManagerService.setD.java: 21184) на android.content.pm.IPackageManager $ Stub.onTransact (IPackageManager.java:3473) на com.android.server.pm.PackageManagerService.onTransact (PackageManagerService.java:4015) на android.os.Binder. execTransactInternal (Binder.java:1021)

Это та же ошибка, что и я.

1 Ответ

0 голосов
/ 06 октября 2019

Итак, я понял, что после дня отладки и изучения Документации для разработчиков Android о ComponentName.

Я реализовал ее в режиме отладки, и мой packageName- applicationId + суффикс. , как вы можете видеть свои в build.gradle .

Раньше я делал что-то вроде

PackageManager pm = getPackageManager();
        ComponentName compName =
                new ComponentName(this, getPackageName() + ".AliasSplashScreen");
        pm.setComponentEnabledSetting(
                compName,
                PackageManager.COMPONENT_ENABLED_STATE_DISABLED,
                PackageManager.DONT_KILL_APP);

СейчасВы видите, что я использовал get package name (), который отличается для каждой сборки, но имя My Class из-за этого не действует.

Имя моего класса есть и всегда будет originalpackagename.classname или более четко applicationid.className. независимо от варианта сборки (отладка или выпуск).

Правильный путь - -

PackageManager pm = getPackageManager();
        ComponentName compName =
                new ComponentName(this, applicationid + ".AliasSplashScreen");
        pm.setComponentEnabledSetting(
                compName,
                PackageManager.COMPONENT_ENABLED_STATE_DISABLED,
                PackageManager.DONT_KILL_APP);

И, как указало CommonsWare, вы должны создать в манифесте Android activity-alias, сохраняя исходный, а targetActivity должен быть тем, чей псевдоним вы создаете. с нужным intent-filter внутри него и используйте приведенный выше код, чтобы отключить его в onCreate () следующего действия и включить его, используя PackageManager.COMPONENT_ENABLED_STATE_ENABLED

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...