【问题标题】:Requesting app runtime permissions (Android)请求应用运行时权限 (Android)
【发布时间】:2020-05-23 17:45:16
【问题描述】:

我想编写一个简单的应用程序来访问设备的位置。只有我会使用该应用程序。这是我 10 年来第一次尝试编写 Android 应用程序,所以这是我第一次不得不处理运行时权限。

我的第一个问题是,鉴于该应用仅供我使用,是否可以绕过对运行时权限代码的需求?

如果做不到这一点,是否有任何简单的示例代码可以填补Android documentation 中的众多空白?

举个例子:文档包括以下内容:

when {
ContextCompat.checkSelfPermission(
        CONTEXT,
        Manifest.permission.REQUESTED_PERMISSION
        ) == PackageManager.PERMISSION_GRANTED -> {
    // You can use the API that requires the permission.
    performAction(...)

这是什么意思?什么“需要许可的 API”?什么代替了“...”?

页面上还有其他几个类似的空白。

【问题讨论】:

  • 我感受到了你的痛苦。为什么 Android 代码需要如此冗长和混淆?

标签: android permissions location


【解决方案1】:

您已经提到该应用程序仅供您使用,那么您不必编写运行时权限的代码,您可以跳过它......

如何做到这一点...?

第 1 步:只需将所需的所有权限放入应用清单文件中并安装应用即可

第 2 步:进入手机中的应用设置应用信息并检查应用权限您提到的所有权限将显示在那里只需手动调整它们

现在就是写代码来访问你应该在获得许可后写的东西

【讨论】:

  • 非常感谢您的及时回复。很高兴知道这一点。我想知道每次编辑并从 Android Studio 重新运行应用程序时是否必须转到设置更改权限,但似乎没有必要。
【解决方案2】:
  1. 如果您想避免运行时权限请求,您可以使用低于 23 (Android 6 Marshmellow) 的 Android SDK 版本构建您的应用

  1. 对于 Android API 级别 23 或更高版本(在清单文件中添加权限后):

首先,将您的权限添加到 AndroidManifest.xml 文件:

<uses-permission android:name="android.permission.THE_PERMISSION" />

然后在你的 Activity 中:

检查权限:

fun checkPermission(permission: String): Boolean {
        return ContextCompat.checkSelfPermission(this, permission) == PackageManager.PERMISSION_GRANTED
    }

获取权限:

fun getPermission(permission: String) {
    ActivityCompat.requestPermissions(this, arrayOf(permission), REQ_CODE_PERMISSION)
}

获取权限结果:

override fun onRequestPermissionsResult(
    requestCode: Int,
    permissions: Array<out String>,
    grantResults: IntArray
) {
    if (requestCode == REQ_CODE_PERMISSION && grantResults[0] == PackageManager.PERMISSION_GRANTED) {
        ...      
    }
    super.onRequestPermissionsResult(requestCode, permissions, grantResults)
    }

如果您使用的是片段:

片段包含请求权限并将结果返回到其onRequestPermissionsResult的方法:

fun getPermission(permission: String) {
    requestPermissions(arrayOf(permission), REQ_CODE_PERMISSION)
}

REQ_CODE_PERMISSION: 是一些像 123 这样的随机数,用于识别您的请求。

【讨论】:

  • 谢谢。如上所述,就我的目的而言,只需通过设置应用授予位置权限似乎就足够了。
【解决方案3】:

是否可以绕过对运行时权限代码的需求?

您仍然需要&lt;uses-permission&gt; 元素。但您可以通过“设置”应用手动授予您的应用权限。

运行时权限代码的要点是向用户请求权限并防止未授予该权限的情况。在您的情况下,如果您的应用程序因您撤销权限而崩溃,您可以向开发人员大喊大叫。反过来,作为开发人员的您可以因为未能手动授予权限而对作为用户的您大喊大叫。由于您会对自己大喊大叫,因此建议您在私人场所进行此操作,或者在您的耳朵中戴上蓝牙耳机作为掩护。 :-)

这是什么意思?

我们请求运行时权限是因为我们想使用一些受此类权限保护的 Android API。我们通常不请求运行时权限,因为我们有一天早上醒来并认为请求运行时权限听起来是一件非常有趣的事情。

什么“需要权限的API”?什么代替了“...”?

在您的情况下,它似乎是 LocationManager 上的方法或使用来自 Google Play 服务的融合位置 API 的东西。

是否有任何简单的示例代码可以填补 Android 文档中的众多空白?

问题是“示例代码”有 5% 与权限相关,而 95% 是您使用的任何需要权限的代码。任何仅显示权限的示例代码都将包含您不喜欢文档中的相同手摇内容。在您的情况下,任何使用位置 API 的最新示例也应该显示运行时权限元素。

FWIW,this directory 包含来自this book 的几个示例项目,它们显示了获取位置。它们有点旧,但确实显示请求运行时权限(主要包含在AbstractPermissionActivity 中)。 This sample 在 Kotlin 中较新,但它用于文件访问权限,而不是位置(在 this other book 中有介绍)。

【讨论】:

  • 非常感谢您提供有趣的背景信息和示例代码链接。幸运的是,就我目前的目的而言,按照建议,通过设置授予位置权限似乎就足够了。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2017-07-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多