Android应用程序是否有办法将请求的权限声明为可选的?
。我想写一个应用程序,请求一组权限,例如其中一个是访问用户的联系人。现在,应用程序可以在没有这个访问权限的情况下工作并做一些有用的事情,但是如果被授予访问权限,它可以做更多的事情。
是否有一种方法让应用程序说"我想要权限X,但你可以拒绝它,在这种情况下,我很乐意以减少的功能运行?"
我不这么认为,因为权限是在清单中设置的,并且在安装.apk时由用户接受。您可以构建具有较少权限和有限功能集的应用程序的轻量级版本,并将其作为替代方案提供。
目前不支持,也不在开发中。如果你想看到它实现,请在Android漏洞跟踪器上发现6266号问题。
裁判:http://code.google.com/p/android/issues/detail?id=6266
可以通过不请求"主"应用程序中的权限并使用相同的android:sharedUserId
创建另一个应用程序("存根")来授予已经安装的应用程序特权,该应用程序请求这些功能。然后,您可以通过检查
context.checkCallingOrSelfPermission(permission) == PackageManager.PERMISSION_GRANTED
计算结果为true (context为有效上下文,permission为权限字符串之一)。如果为真,则您的存根应用程序已安装,您可以解锁需要授予权限的功能。如果为假,则返回到基本特征。
当你以这种方式设计你的应用程序时,你可以很容易地在主apk中重新引入可选的权限,而无需更改任何代码,例如,如果你分发多个版本。
现在可以通过触发安装(其中一个)存根应用程序来查询用户的权限。因此,如果在某个活动中输入某些用户后需要您的特权,则启动apk以在特权未被授予时弹出(当然,您可以在其前面放置解释性活动),并在从包管理器返回或之前授予权限时执行该功能。你也可以把启用或禁用权限的选项放在你的首选项或第一次对话框的某个地方。
对于懒惰的人(像我一样),关于如何启动软件包安装程序的简短总结:使用Intent.ACTION_VIEW
为file://
-URI创建Intent
,使用类型"application/vnd.android.package-archive"
。资产和资源不能直接工作,例如,你可以将它作为资产捆绑并复制到缓存文件夹或类似的地方。
警告:这个答案可能不符合Google Play ToS,因为这种方法有一些卸载问题(可能会泄漏应用程序,见下文),特别是通过第三方机制卸载时(如Google Play,因为用户看不到使用这些方法的辅助应用程序),并且作为可选的特权不能在Play商店中显示。
对于卸载问题,我建议使用像"MyApp: XXX权限"这样的名称,因为应用程序名称是"MyApp",所以用户可以很容易地按字母顺序删除它们。或者,如果您可以忍受存根应用程序变得越来越复杂,那么可以使用这里提到的ACTION_PACKAGE_REMOVED。