如何在不实际启动 activity 的情况下检查 activity 的外部应用程序有 "exported=false"

How to check an activity of external App has "exported=false" without actually starting the activity

一些厂商的自定义OS在设置中实现了自定义功能或隐藏功能。(例如:ColorOS、MIUI、FlymeOS、EMUI)我试过了打开那些系统APP的一些活动。我使用 context.getPackageManager().resolveActivity(intent, PackageManager.MATCH_DEFAULT_ONLY) != null 检查这些活动是否存在。

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

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

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

resolveActivityInfo() method instead of resolveActivity() to get an ActivityInfo object. This object extends ComponentInfo which has an exported属性可以用来查看Activity是否导出。

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