Android 自定义权限失败(基于应用安装顺序)

我的应用在 Google Play 上出现问题。我有一个利用自定义权限的免费应用程序。此权限允许访问付费应用。这些付费应用程序充当“钥匙”并解锁免费应用程序中的功能。基本上,免费应用程序将尝试启动其中一个付费应用程序的意图。付费应用程序将做一些事情并返回,说明免费应用程序是否应该解锁功能。

根据应用程序安装的顺序出现问题。如果先安装免费应用,然后再安装付费应用,则免费应用无法启动意向。返回权限拒绝。如果先安装付费应用,那么免费应用,免费应用可以启动意向没问题。重新启动设备和/或强制停止应用程序并不能解决问题。我正在附加相关代码。有些东西告诉我,我做错了什么。

  • 免费应用程序清单(相关代码):

    ...
    <uses-permission android:name="com.company.license.PERMISSION" />
    ...
    
  • 用于检查意图的免费应用程序代码(相关代码):

    Intent KeyApp = new Intent("com.company.license.action.AUTH_1");
    KeyApp.putExtra("com.company.license.challenge", 1);
    
    //If free app is installed first, an exception is thrown for not having the proper permission. If paid app is installed first, no exception is thrown
    try {
        startActivityForResult(KeyApp, COMMING_FROM_KEYAPP);
    } catch (Exception e) {
        cancelStartUp();
    }
    
  • 付费应用清单(相关代码):

    <manifest xmlns:android="http://schemas.android.com/apk/res/android"
        package="com.company.installer.1"
    ...
    <permission
        android:name="com.company.license.PERMISSION"
        android:icon="@drawable/icon"
        android:label="@string/app_name"
        android:protectionLevel="normal" >
    </permission>
    
    <application
        android:icon="@drawable/icon"
        android:label="@string/app_name"
        android:theme="@android:style/Theme.NoDisplay" >
    
        <activity
            android:name="com.company.license.auth"
            android:configChanges="keyboardHidden|orientation"
            android:exported="true"
            android:permission="com.company.license.PERMISSION"
            android:theme="@style/Theme.Transparent" >
            <intent-filter>
                <action android:name="com.company.license.action.AUTH_1" />
    
                <category android:name="android.intent.category.DEFAULT" />
            </intent-filter>
        </activity>
    
        <activity
            android:name="com.company.installer.redirect"
            android:configChanges="keyboardHidden|orientation"
            android:exported="true"
            android:theme="@style/Theme.Transparent" >
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />
    
                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>
    </application>
    
    </manifest>
    

答案 1

将相同的元素放在两个应用中。另外,由于这是特定于您的两个应用程序,因此我将使用而不是 - 这意味着用户将永远不需要批准权限,并且没有其他人能够请求该权限。并且,此配方将允许按任一顺序安装。<permission>android:protectionLevel="signature"normal

更新:但是,请注意,由于Android的“第一个赢家”方法,使用自定义权限会打开潜在的漏洞。

更新#2从Android 5.0开始,现在不再支持此功能,因为两个应用程序不能同时具有相同的元素,除非它们由相同的签名密钥签名。<permission>


答案 2

我能够解决他的更新#2中提到的@CommonsWare问题。只需在将首先安装的应用程序中声明权限即可。

说明:我有应用程序 A 和应用程序 B,它们使用不同的签名进行签名。应用 A 需要使用应用 B 登录,但应用 A 首先安装并确保用户安装应用 B。

由于应用程序 B 似乎是(登录)服务,我在应用程序 B 中声明了自定义权限,因此应用程序 B 具有其他应用程序可以使用的(意图)服务,只要它们使用该权限并在我们的白名单中。因此,应用 B 声明了服务和权限。

但是,由于应用程序 A 是在应用程序 B I 发现之前安装的,因此我需要将权限也添加到应用程序 A。否则,应用程序 A 在安装应用程序 B 后似乎没有权限。我最好的猜测是,这是因为权限内容是在安装时完成的。由于应用程序A没有声明权限,因此在安装时没有任何反应。但是,随后安装了具有权限的应用程序 B,但应用程序 A 仍未收到此权限。

但后来我在Android 5上进行了测试,并遇到了他们独特的权限更改。因此,我测试了一些流程和权限声明,并提出了一个有效的解决方案:在首先安装的应用程序中声明自定义权限!当然,这只有在您知道要首先安装哪个应用程序时才有效。但在我的情况下,应用程序A依赖于应用程序B,应用程序A安装应用程序B,这是解决方案:)


推荐