You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

安装顺序致跨App启动遇SecurityException权限拒绝问题求助

问题原因

当你先安装App1再安装App2时,Android系统不会自动为App1补发自定义权限。因为App1安装时,com.mycompany2.app2.app2permission这个权限还不存在(App2未安装),系统会跳过该权限的授予流程;后续安装App2后,系统不会主动重新检查并授予App1已声明的权限,导致启动App2时触发SecurityException。

反过来先装App2再装App1时,系统已经注册了该自定义权限,安装App1时会正常处理权限声明,所以能顺利启动App2。

解决方案

1. 动态检查权限,引导用户重装App1

在启动App2前,先检查是否已获得目标权限,若未获得则提示用户重装App1:

fun openApp2() {
    val permission = "com.mycompany2.app2.app2permission"
    val hasPermission = packageManager.checkPermission(permission, packageName) == PackageManager.PERMISSION_GRANTED

    if (!hasPermission) {
        Toast.makeText(this, "请卸载重装App1以获取必要权限", Toast.LENGTH_LONG).show()
        return
    }

    val intent = Intent("com.mycompany2.app2.ACTIVITY1")
    intent.putExtra("data", "otherdata") // 注意你重复put了同一个key,后面的值会覆盖前面的
    intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK)

    registerForActivityResult(ActivityResultContracts.StartActivityForResult()) { result ->
        Log.d(TAG, "${result.resultCode}")
        finish()
    }.launch(intent)
}

2. 把自定义权限设为签名级别(同签名应用适用)

如果两个App属于同一家公司,可以将App2中的自定义权限保护级别设为signature,只要两个App用相同签名打包,无论安装顺序如何,系统都会自动授予App1该权限:

App2的Manifest配置

<!-- 声明自定义权限 -->
<permission
    android:name="com.mycompany2.app2.app2permission"
    android:protectionLevel="signature" />

<!-- 给Activity添加权限限制 -->
<activity android:name="com.mycompany2.app2.features.app2.Activity1">
    <intent-filter>
        <action android:name="com.mycompany2.app2.ACTIVITY1" />
        <category android:name="android.intent.category.DEFAULT" />
    </intent-filter>
    <intent-filter android:permission="com.mycompany2.app2.app2permission" />
</activity>

这种方式不需要用户干预,系统会自动完成权限授予,是最顺畅的解决方案。

3. 改用包名验证替代自定义权限

如果不需要严格的系统权限控制,可以在App2中验证调用方的包名,确保只有App1能启动它:

App2的Activity代码

override fun onCreate(savedInstanceState: Bundle?) {
    super.onCreate(savedInstanceState)
    // 获取调用方包名
    val callingPackage = packageManager.getCallingPackage()
    if (callingPackage != "com.mycompanion.app1") {
        // 非授权调用方,直接关闭页面
        finish()
        return
    }
    // 正常处理业务逻辑
}

这种方式完全绕开了系统权限的授予逻辑,不受安装顺序影响。

内容的提问来源于stack exchange,提问作者mnunezdm

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.24 13:25:15