Android权限相关问题

时间:2019-08-14 14:32:16

标签: android android-manifest android-permissions

我有一个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安装过程中完成权限。我使用的是API29。是否可以在此提示用户在安装过程中自行授予权限?

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

我现在所做的:

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

是否有更好的解决方案?是否喜欢通过某种方式默认强制外部存储的权限或采取其他方式?据我了解,最新的Android版本看起来不太可能。但是,如果有办法,请告诉我。

谢谢, 阿南德

4 个答案:

答案 0 :(得分:0)

为了知道用户是否已使用您请求的权限允许该应用程序,您应该覆盖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有一个不错的教程,比我上面做的还要完整,但是您明白了。

答案 1 :(得分:0)

  

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

From official doc

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

Also

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

无论如何都要注意this point

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

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

  

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

还可以在服务中使用ContextCompat.checkSelfPermission
启动服务时,可以检查是否已授予许可,并避免失败。

您只能在活动中使用ActivityCompat.requestPermissions ,但可以使用回调onRequestPermissionsResult来启动服务。

  

有没有更好的解决方案?

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

>

答案 2 :(得分:0)

无法在安装时强制许可,您需要将API级别定位为<23,但现在您需要使用28/29在PlayStore上创建/更新应用。您可以考虑使用替代存储位置,例如getCacheDir()将文件移动到以后具有应用权限的位置,或者将getExternalFilesDir()移到无需附加许可即可读取/写入的路径。

答案 3 :(得分:0)

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

如果您的服务使用这些权限之一,则必须在启动服务之前每次都检查该权限,然后仅在授予该权限的情况下启动该服务。否则,请寻求许可,重写onActivityResult,然后仅在授予许可的情况下启动服务。

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