【问题标题】:Is it possible to have "optional" permissions in Android?是否可以在 Android 中拥有“可选”权限?
【发布时间】:2011-08-08 09:58:40
【问题描述】:

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

即我想编写一个请求一组权限的应用程序,例如其中之一是访问用户联系人。现在,应用程序可以在没有此访问权限的情况下工作并做有用的事情,但如果被授予,它可以做更多事情。

有没有办法让应用程序说“我想要权限 X,但你可以拒绝它,在这种情况下我很乐意以减少的功能运行?”

【问题讨论】:

    标签: android permissions


    【解决方案1】:

    我不这么认为,因为权限是在清单中设置的,并在安装 .apk 时被用户接受。您可以构建具有较少权限和有限功能集的应用程序的轻量版本,并将其作为替代方案提供。

    【讨论】:

    【解决方案2】:

    到目前为止,它不受支持且未在开发中。如果您希望看到它的实现,请在 Android 错误跟踪器上加注星标issue 6266

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

    【讨论】:

    • 我注意到问题 6266 已过时关闭。据我所知,鉴于这个问题与以往一样相关,我不清楚为什么。
    【解决方案3】:

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

    context.checkCallingOrSelfPermission(permission) == PackageManager.PERMISSION_GRANTED
    

    评估为真(上下文作为有效上下文,权限作为权限字符串之一)。如果为真,则您的存根应用程序已安装,您可以解锁需要授予权限的功能。如果它是假的,你就回退到基本功能。

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

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

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


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

    对于卸载问题,我建议使用“MyApp:XXX 权限”之类的名称,因为应用程序名称是“MyApp”,因此用户可以轻松地将它们全部从按字母顺序列出的列表中删除。或者,如果您可以忍受越来越复杂的存根应用程序,请使用 ACTION_PACKAGE_REMOVED as mentioned here

    【讨论】:

    猜你喜欢
    • 2017-07-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多