我的Google Play应用有问题。我有一个免费的应用程序,它使用自定义权限。此权限允许访问付费应用。这些付费应用程序充当“钥匙”并解锁免费应用程序中的功能。基本上,免费应用程序将尝试启动其中一个付费应用程序的意图。付费应用程序将执行一些操作并返回说明免费应用程序是否应该解锁功能。
根据应用安装的顺序出现问题。如果首先安装免费应用程序然后安装付费应用程序,则免费应用程序无法启动意图。返回权限拒绝。如果首先安装付费应用程序然后安装免费应用程序,免费应用程序可以启动意图没问题。重新启动设备和/或强制停止应用程序无法解决问题。我正在附上相关代码。有些东西告诉我,我做错了什么。
免费App Manifest(相关代码):
...
<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>
答案 0 :(得分:12)
在两个应用中放置相同的<permission>
元素。此外,由于这是针对您的两个应用程序的,因此我会使用android:protectionLevel="signature"
而不是normal
- 这意味着用户永远不需要批准该权限,其他任何人都无法请求权限。而且,这个配方将允许以任何顺序安装。
更新:但请注意,使用自定义权限会打开potential vulnerabilities, due to Android's "first one in wins" approach。
更新#2 :现在这是no longer supported as of Android 5.0,因为两个应用不能同时具有相同的<permission>
元素,除非它们由相同的签名密钥签名。
答案 1 :(得分: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,这是解决方案:)