2015-11-02 69 views
11

在Android OS 4.0上运行我的应用程序,并要求READ_EXTERNAL_STORAGE许可使用时,我有一个问题:的Android棉花糖权限模型始终未授予

ActivityCompat.requestPermissions(ctx, requestedPermissions, requestCode); 

我总是在回调

public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, 
     @NonNull int[] grantResults) { 

grantResults != PackageManager.PERMISSION_GRANTED 

使用ActivityCompat.checkSelfPermission检查权限始终返回permissionDenied

它通过请求系统对话框的权限在OS 6.0上运行良好。 Android OS 4.x例外4.0总是授予权限。 OS 4.0的其他权限(相机,日历,联系人,电话)行为良好,除了READ_EXTERNAL_STORAGE导致此问题。

也许操作系统的问题?

+0

这很奇怪。您可以尝试使用 .requestPermission(requestedPermissions,requestCode)的正常权限方法; – dex

+1

http://stackoverflow.com/questions/32129716/how-does-storage-access-change-on-android-6 –

+0

@dex问题是活动相关的权限方法只能通过API 23 – skirix

回答

11

What ActivityCompat.requestPermissions() does是:

  • 电话接到真正requestPermissions()如果你是在Android 6.0以上版本,或

  • 使用PackageManager看到,如果你持有旧版Android

    的请求的权限

READ_EXTERNAL_STORAGE的问题是,它是在API级别16中添加(安卓4.1 )。你不能在较旧的Android版本上保留它,原因很简单,因为它不存在。

或者:

  • 设置你的minSdkVersion至16,或

  • 把自己的逻辑来处理这种情况,认识到READ_EXTERNAL_STORAGE是API级别16

之前无关
+0

现在一切都清楚了!谢谢 – skirix

+7

一个简单的解决方法是请求'WRITE_EXTERNAL_STORAGE'权限,而不是API 4。在M中,'WRITE'和'READ'位于同一个权限组中,因此请求前者将授予对后者的访问权限以及。唯一的缺点是4.1之前的版本会发现需要新的权限,如果您以前只请求“READ”。 – Sebastiano

+1

@dextor:假设Android将始终要求用户在权限组级别的权限,而不是权限的级别。我不会做出这样的假设。 – CommonsWare