Android应用程序是否有办法将请求的权限声明为可选权限?
即。我想编写一个请求一组权限的应用,例如其中一个是访问用户联系人。现在,如果没有此访问权限,应用程序可以工作并执行有用的操作,但如果授予它,它可以执行更多操作。
有没有办法和应用程序说“我想要许可X,但你可以拒绝它,在这种情况下我很乐意运行功能减少?”
答案 0 :(得分:9)
我不相信,因为权限在清单中设置并在安装.apk时由用户接受。您可以使用减少的权限和有限的功能集来构建应用程序的简易版本,并将其作为替代方案提供。
答案 1 :(得分:5)
目前尚未支持且尚未开发。如果您希望看到它已实施,请在Android错误跟踪器上加注星标issue 6266。
答案 2 :(得分:5)
可以通过不在“主”应用程序中请求权限以及使用请求功能的相同android:sharedUserId
创建另一个应用程序(“存根”)来为已安装的应用程序授予权限。然后,您可以通过检查
context.checkCallingOrSelfPermission(permission) == PackageManager.PERMISSION_GRANTED
计算结果为true(上下文为有效上下文,权限为权限字符串之一)。如果确实如此,您的存根应用程序已安装,您可以解锁需要授予权限的功能。如果它是假的,你只需回到基本功能。
以这种方式设计应用程序时,您可以轻松地将可选权限重新引入主apk,而无需更改任何代码,例如,如果您分发多个版本。
您现在可以通过触发存储应用程序(其中一个)的安装来查询用户的权限。因此,如果在活动中的某些用户输入后需要您的权限,如果尚未授予权限,则启动apk以弹出(当然您可以在其前面放置解释性活动),并在返回时执行该功能包管理器或之前授予权限的时间。您也可以选择在首选项或第四个对话框中的某处启用或禁用权限。
对于懒惰的人(像我一样),简要介绍如何启动程序包安装程序:使用Intent
Intent.ACTION_VIEW
为file://
- URI创建"application/vnd.android.package-archive"
使用类型{{1} }}。资产和资源不能直接使用,例如,您可以将其捆绑为资产并将其复制到缓存文件夹或类似文件。
警告:此答案可能不符合Google Play ToS,因为此方法存在一些卸载问题(可能会泄漏应用程序,请参阅下文),尤其是在通过第三方机制卸载时(例如Google Play) ,因为用户没有看到使用这些方法的帮助应用程序)并且因为可选权限无法在播放商店中显示。
对于卸载问题,我建议使用“MyApp:XXX权限”之类的名称,因为应用程序名称为“MyApp”,因此用户可以使用按字母顺序排列的列表轻松删除它们。或者,如果您可以使存根应用程序变得更复杂,请使用ACTION_PACKAGE_REMOVED as mentioned here。