【问题标题】:Android permissions related issueAndroid权限相关问题
【发布时间】:2019-08-14 14:32:16
【问题描述】:

我有一个 Android 应用,它需要读取/写入外部存储的权限。当应用程序启动时,它会提示用户允许外部存储(以及一系列其他服务 - 位置、相机等)。

我们是这样做的:

ActivityCompat.requestPermissions(this, new String[]{WRITE_EXTERNAL_STORAGE, CAMERA,ACCESS_FINE_LOCATION,INTERNET,WRITE_SETTINGS,ACCESS_WIFI_STATE,READ_PHONE_STATE}, PERMISSION_REQUEST_CODE)

现在,我们还需要从外部存储中读取身份验证服务。我们在启动时调用此身份验证服务。

现在,问题是:当您在安装后第一次运行应用程序时,这种对身份验证服务的调用可能经常发生在授予外部存储权限之前。因为认证服务没有对​​外存储的权限,所以认证失败。

我们现在做的解决方法:安装后手动启用权限,然后运行应用程序。虽然不是一个长期的解决方案。

我做了一些阅读,似乎在较旧的 API 中,我们可以强制在 apk 安装期间完成权限。我使用的是 API 29。是否可以在此处提示用户在安装过程中授予权限?

我也了解这被视为一项关键服务,我们无法绕过权限。相反,我们不能强制将权限设为默认值。

我现在做了什么:

稍后在代码中初始化身份验证服务,使其仅在获得权限后运行。

有没有更好的解决方案?像默认情况下强制外部存储权限的某种方式还是其他方式?根据我的阅读,最新的 Android 版本看起来不太可能。但是,如果有办法做到这一点,请告诉我。

谢谢, 阿南德

【问题讨论】:

    标签: android android-manifest android-permissions


    【解决方案1】:

    为了知道用户是否允许具有您请求的权限的应用程序,您应该覆盖onRequestPermissionsResult(requestCode: Int, permissions: Array<out String>, grantResults: IntArray)

    这样,你可以做这样的事情:

    if (requestCode == PERMISSION_REQUEST_CODE) {
        for (elem in grantResults) {
            if (elem != PackageManager.PERMISSION_GRANTED)
                // Abort your feature here
        }
        // Do your feature here
    }
    

    如果每个权限都通过了,你就可以做你想做的事了。

    Android Developer Documentation 有一个很好的教程,比我上面做的更完整,但你明白了。

    【讨论】:

      【解决方案2】:

      无法在安装时强制许可,您需要将 API 级别设为 getCacheDir() 移动文件,当您的应用程序获得权限时您需要稍后移动文件,或者仅使用 getExternalFilesDir() 路径,您可以在没有额外权限的情况下读取/写入。

      【讨论】:

        【解决方案3】:

        是否可以在安装过程中提示用户授予权限?

        From official doc:

        如果设备运行的是 Android 6.0(API 级别 23)或更高版本,并且应用的 targetSdkVersion23 或更高,则在安装时不会通知用户任何应用权限。

        Also:

        如果设备运行的是 Android 5.1.1(API 级别 22)或更低版本,或者在任何 Android 版本上运行时应用的 targetSdkVersion 为 22 或更低版本,系统会自动要求用户为您的应用授予所有危险权限在安装时(见图 2)。

        无论如何关注this point:

        从 Android 6.0(API 级别 23)开始,用户可以随时撤消任何应用的权限,即使该应用的目标 API 级别较低。

        换句话说,这意味着今天您必须在代码中检查并请求权限。

        稍后在代码中初始化身份验证服务,使其仅在获得权限后运行。

        可以在服务中使用ContextCompat.checkSelfPermission
        当您启动服务时,您可以检查权限是否被授予并避免失败。

        您可以在 Activity 中仅使用ActivityCompat.requestPermissions,但您可以使用回调onRequestPermissionsResult 来启动您的服务。

        有没有更好的解决方案?

        不能强制该权限,但例如您的服务可以检查它需要的权限,如果尚未授予,您可以创建一个友好的通知来通知用户。

        【讨论】:

          【解决方案4】:

          在安装之前不能强行请求诸如读/写外部存储、相机、短信、联系人和其他一些关键权限。因此,必须在运行时要求它们。最佳做法是在实际需要时才请求它们,而不是一开始就一次性请求它们。

          如果您的服务使用这些权限之一,您必须在每次启动服务之前检查该权限,然后仅在授予权限后启动服务。否则,请求权限,覆盖onActivityResult,只有获得权限后才启动服务。

          此外,请记住在用户选中“不再询问”复选框并拒绝许可时处理这种情况。在这种情况下,用户将不会再次看到提示。因此,您必须使用意图打开权限设置。

          【讨论】:

            猜你喜欢
            • 2016-06-30
            • 1970-01-01
            • 2016-12-01
            • 2021-11-16
            • 1970-01-01
            • 2011-07-25
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多