当前位置: 首页 > 知识库问答 >
问题:

如何在Android中以编程方式禁用特定的意图过滤器?

龚寂弦
2023-03-14
<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);

我不知道上面的代码到底在哪里写。我在闪屏的oncreate中设置了这段代码,但是得到的错误是-

无法启动活动ComponentInfo java.lang.SecurityException:试图更改组件状态;

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

因此,我在SplashScreen之后打开的MainActivity的oncreate()中调用代码-

2019-10-06 04:49:52.578 230 14-23014/com.khaalijeb.inkdrops.debug e/androidruntime:致命异常:main process:com.khaalijeb.inkdrops.debug,pid:23014 java.lang.runtimeexception:无法启动活动ComponentInfo{com.khaalijeb.inkdrops.mainactivity}:java.lang.securityexception:试图更改组件状态;pid=23014,uid=10262,component=com.khaalijeb.inkdrops/.splashscreen at android.app.activitythread.performlaunchactivity(activitythread.java:3270)at android.app.activitythread.handlelaunchactivity(activitythread.java:3409)at android.app.servertransaction.launchActivity(activitythread.java:3409)at在Android.app.activityThread$h.handleMessage(activityThread.java:2016),在Android.os.handler.dispatchMessage(handler.java:107),在Android.os.handler.dispatchMessage(handler.java:107),在Android.app.activityThread.loop(looper.java:214),在Android.app.activityThread.main(activityThread.java:7356),在java.lang.reflect.Method.invoke(原生30)原因: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)在Android.os.parcel.readException(parcel.java:1987)在Android.content.pm.ipackageManager$stub$proxy.setcomponentenabledset(ipackageManager.java:7336)在在Android.app.activity.performCreate(activity.java:1604),在Android.app.activity.performCreate(activity.java:7802),在Android.app.activity.performCreate(activity.java:7791),在Android.app.instrumentation.callactivityonCreate(activity.java:1306),在Android.app.activity.java:3245),在Android.app.activity.java:3409),在在Android.app.serverTransaction.launchActivityItem.execute(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:远程堆栈跟踪:at com.android.server.pm.PackageManagerService.setenabledSett(packageManagerService.java:21250)at com.android.server.pm.packageManagerService.setComponentenabledSett(packageManagerService.java:21184)at android.content.pm.ipackageManager$stub.onTransact(ipackageManager.java:3473)at 1021)

这是我得到的同样的错误。

共有1个答案

黄兴业
2023-03-14

所以,经过一天的调试和查看Android开发人员关于ComponentName的文档,我才意识到。

我是在调试模式下实现它的,我的packageName是-applicationId+后缀。你可以看到你的建筑。格雷德尔。

以前,我在做一些类似的事情

PackageManager pm = getPackageManager();
        ComponentName compName =
                new ComponentName(this, getPackageName() + ".AliasSplashScreen");
        pm.setComponentEnabledSetting(
                compName,
                PackageManager.COMPONENT_ENABLED_STATE_DISABLED,
                PackageManager.DONT_KILL_APP);
PackageManager pm = getPackageManager();
        ComponentName compName =
                new ComponentName(this, applicationid + ".AliasSplashScreen");
        pm.setComponentEnabledSetting(
                compName,
                PackageManager.COMPONENT_ENABLED_STATE_DISABLED,
                PackageManager.DONT_KILL_APP);
 类似资料:
  • 问题内容: 尽管我看过很多类似的问题,但没有找到明确的答案。使用Servlet Spec 2.5,是否可以以编程方式添加Servlet过滤器和映射?首选位置在Servlet.init()或ServletContextListener.contextInitialized()中。 问题答案: 不,不是通过标准的Servlet 2.5 API。这是在Servlet 3.0 中引入的。最好的选择是创建一

  • 本文向大家介绍在iOS中以编程方式禁用滚动视图?,包括了在iOS中以编程方式禁用滚动视图?的使用技巧和注意事项,需要的朋友参考一下 滚动视图是iOS开发人员遇到的最困难和最复杂的主题之一。在这里,我们将看到如何以编程方式禁用滚动视图。 要禁用它,我们需要使滚动视图的“ isScrollEnabled”属性为false。 将以下代码复制到文件中。

  • 是否有一种编程(基于属性)的方法在Spring引导(1.2.2)中禁用RabbitAutoConfiguration。 看起来像Spring。rabbitmq。dynamic=false仅禁用AmqpAdmin,而不禁用连接工厂等。 我们想要一个模型,其中应用程序属性可以来自Spring Cloud config(包括控制总线)或通过-D jvm args。这个决定是在部署时做出的。当属性来自-D

  • 我想以编程方式启用/禁用设置->辅助功能选项下列出的辅助功能服务。 我可以像下面这样开始可访问性意图: 但是对于如何通过我的代码启用视图中列出的服务,我没有任何想法。 请把你的观点告诉我。

  • 请在这里参考我的问题。这个问题是它的延伸: 如何在有线耳机和免提电话之间检查和重定向音频? 通过包含权限,我能够部分解决我的问题 在我的Android清单中,同样的代码。现在,我可以启用和禁用手机扬声器,但当有线耳机仍与手机物理连接时,我无法以编程方式关闭有线耳机连接。 有人能在这里帮助我吗?我是否可以使用特定的意图来禁用和启用有线耳机连接?

  • 我想以编程方式创建3x3网格视图以显示图像。我想通过获取屏幕尺寸来设置每个项目的高度和宽度。像: 然后每个项目 请有人帮助我或一些参考链接。