Android的自定义权限基于应用程序安装顺序失败的定位思路(Android Custom Perm

2019-06-26 15:14发布

和我在谷歌Play应用的问题。 我有一个免费的应用程序,它利用自定义权限。 此权限允许访问付费应用。 这些付费应用作为“钥匙”,并在免费应用程序解锁功能。 基本上免费的应用程序将尝试启动了付费应用程序之一的意图。 在付费应用程序会做一些东西,并返回说免费的应用程序是否应解锁功能,或者不。

问题出现了基于应用程序的安装顺序。 如果免费的应用程序首次安装,然后付费应用,免费的应用程序无法启动的意图。 返回权限拒绝。 如果安装了付费应用程序第一次那么免费的应用程序,免费的应用程序可以启动的意图没有问题。 重新启动设备和/或力停止的应用程序不能解决问题。 我附加了relavent代码。 东西告诉我,我做得不正确。

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

     ... <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> 

Answer 1:

把同样的<permission>元件在两个应用程序。 此外,由于这是特定于您的两个应用程序,我会用android:protectionLevel="signature"来代替normal -这意味着用户将永远不需要批准许可,并没有其他人可以请求许可。 而且,这个食谱将允许以任何顺序安装。

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

更新#2:这现在不再支持Android 5.0系统的 ,因为两个应用程序不能同时具有相同的<permission>元素,除非它们是由同一个签名密钥签名。



Answer 2:

我能够解决此问题@CommonsWare在他的更新#2提及。 通过简单的声明只在其中将首先安装该应用程序的权限。

说明:我的应用程序A和应用程序B,用不同的签名签署。 应用程序A需要使用的应用程序B到登录,但应用一被安装第一,并确保用户在安装应用程序B.

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

但由于应用BI发现之前安装一个应用程序,我需要添加的权限,以及对应用A.否则应用一个似乎没有安装的应用程序B.后具有的权限我最好的猜测是,这是因为权限的东西在安装完成。 而且,由于应用A未申报的许可,在安装时什么都没有发生。 但随后的应用B被安装的有权限,但一个应用程序仍然没有收到此权限。

但后来我测试了Android上的5跑进他们独特的权限更改。 所以,我测试了一些流程和权限的声明和与工作解决方案想出了:声明自定义权限在被第一次安装的应用程序! 当然,当你知道哪些应用程序会先安装这只是工作。 但对我来说,其中应用程序A依赖于应用程序B和应用程序安装一个应用程序B,这是解决方案:)



文章来源: Android Custom Permission Fails Based on App Install Order