是否可以在Android中拥有"可选"权限?

Car*_*ten 18 permissions android

有没有办法让Android应用程序将请求的权限声明为可选?

即我想编写一个请求一组权限的应用程序,例如其中一个访问用户联系人.现在,如果没有此访问权限,应用程序可以工作并执行有用的操作,但如果授予它,它可以执行更多操作.

有没有办法和应用程序说"我想要许可X,但你可以拒绝它,在这种情况下,我很高兴运行功能减少?"

Raw*_*Bag 9

我不相信,因为权限在清单中设置并在安装.apk时由用户接受.您可以使用减少的权限和有限的功能集来构建应用程序的简易版本,并将其作为替代方案提供.


dra*_*gon 5

它目前尚未得到支持且尚未开发.如果你想看到它实现的话,Android 问题跟踪器上的星问题6266.

参考:http://code.google.com/p/android/issues/detail? id = 6266


dst*_*dst 5

可以通过不在"主"应用程序中请求权限并通过使用相同的android:sharedUserId请求功能创建另一个应用程序("存根")来向已安装的应用程序授予权限.然后,您可以通过检查是否已安装权限存根应用程序来检查

context.checkCallingOrSelfPermission(permission) == PackageManager.PERMISSION_GRANTED
Run Code Online (Sandbox Code Playgroud)

计算结果为true(将上下文作为有效上下文,将权限作为权限字符串之一).如果确实如此,您的存根应用程序已安装,您可以解锁需要授予权限的功能.如果它是假的,你只需回到基本功能.

在以这种方式设计应用程序时,您可以轻松地将可选权限重新引入主apk,而无需更改任何代码,例如,如果您分发多个版本.

您现在可以通过触发(一个)存根应用程序的安装来查询用户的权限.因此,如果在活动中的某些用户输入后需要您的权限,如果尚未授予权限,则启动apk以弹出(当然您可以在其前面放置解释性活动),并在返回时执行该功能包管理器或之前授予权限的时间.您也可以选择在首选项或第四个对话框中的某个位置启用或禁用权限.

对于懒人(像我一样)关于如何启动软件包安装程序的简短摘要:使用Type 为-URI 创建一个Intent使用.资产和资源不能直接工作,例如,您可以将其捆绑为资产并将其复制到缓存文件夹或类似文件.Intent.ACTION_VIEWfile://"application/vnd.android.package-archive"


警告:此答案可能不符合Google Play ToS,因为此方法存在一些卸载问题(可能会泄漏应用程序,请参见下文),尤其是在通过第三方机制卸载时(例如Google Play,因为用户没有看到帮助应用程序)使用这些方法)并且作为可选权限无法在播放商店中显示.

对于卸载问题,我建议使用"MyApp:XXX权限"等名称,因为应用程序名称为"MyApp",因此用户可以轻松地将其全部按字母顺序列出的列表中删除.或者,如果您可以使存根应用程序变得更复杂,请使用此处提到的 ACTION_PACKAGE_REMOVED .