Android 如何检查外部应用程序的活动;exported=false";没有真正开始活动

Android 如何检查外部应用程序的活动;exported=false";没有真正开始活动,android,android-activity,android-manifest,start-activity,android-securityexception,Android,Android Activity,Android Manifest,Start Activity,Android Securityexception,制造商的一些定制操作系统在设置中实现了定制功能或隐藏功能。(例如:ColorOS、MIUI、FlymeOS、EMUI)我尝试打开这些系统应用程序的一些活动。我使用了context.getPackageManager().resolveActivity(intent,PackageManager.MATCH_DEFAULT_仅限)!=null检查这些活动是否存在 即使这些活动存在,但当我startActivity(意图)时,有时它会导致安全异常,因为该活动的清单声明了exported=false,

制造商的一些定制操作系统在设置中实现了定制功能或隐藏功能。(例如:ColorOS、MIUI、FlymeOS、EMUI)我尝试打开这些系统应用程序的一些活动。我使用了
context.getPackageManager().resolveActivity(intent,PackageManager.MATCH_DEFAULT_仅限)!=null
检查这些活动是否存在

即使这些活动存在,但当我
startActivity(意图)时,有时它会导致安全异常,因为该活动的清单声明了
exported=false
,或者它使用了一些奇怪的权限(例如:
),此外,这些安全变量在不同的固件版本上并不总是相同的,所以我需要手动检查它们。我知道我可以使用
try{}catch{}
来处理
startActivity()并在启动失败时显示错误提示

然而,在我的应用程序中,我想列出许多可点击的按钮链接到这些活动。如果我列出了许多按钮,并且大多数按钮在单击时都会显示错误,那么这肯定不是一个好主意。我不需要显示所有的按钮,而是需要隐藏那些即使存在也无法启动的活动的按钮点。如果我用
调用
startActivity()
并尝试{}catch{}
逐个检查,用户将看到许多活动正在启动,我不希望发生这种情况。

如何检查是否可以启动第三方应用程序的活动,但不实际调用
startActivity()

方法而不是
resolveActivity()
,以获取对象。此对象扩展了
ComponentInfo
,该对象具有一个属性,可用于查看活动是否已导出

ActivityInfo info = intent.resolveActivityInfo(context.getPackageManager(),
    PackageManager.MATCH_DEFAULT_ONLY);
boolean show = info != null && info.exported;
方法而不是
resolveActivity()
来获取对象。此对象扩展了
ComponentInfo
,该对象具有一个属性,可用于查看活动是否已导出

ActivityInfo info = intent.resolveActivityInfo(context.getPackageManager(),
    PackageManager.MATCH_DEFAULT_ONLY);
boolean show = info != null && info.exported;