我有一个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版本看起来不太可能。但是,如果有办法,请告诉我。
谢谢, 阿南德
答案 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)
是否可以在此提示用户在安装过程中自行授予权限?
如果设备运行的是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打开权限设置。