13

我在 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>
    
4

2 回答 2

12

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

更新:但是请注意,由于 Android 的“第一个获胜”方法,使用自定义权限会带来潜在的漏洞

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

于 2012-07-30T21:46:01.627 回答
2

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

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

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

但是因为应用程序 A 是在应用程序 BI 发现之前安装的,所以我需要将权限也添加到应用程序 A。否则应用程序 A 在安装应用程序 B 后似乎没有权限。我最好的猜测是,这是因为权限的东西是在安装时完成。而且由于应用 A 没有声明权限,所以在安装时什么也没发生。但是随后安装了具有权限的应用程序 B,但应用程序 A 仍然没有收到此权限。

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

于 2016-04-13T16:17:24.873 回答