您的位置:首页 > 移动开发 > Android开发

Android 6.0新特性之 权限管理

2016-01-14 11:45 597 查看
Android 6.0中增加了 运行时permissions,就是说可以在运行时判断有无权限和获取权限,让用户同意即可。

在之前的版本都是安装的时候就会要用户同意各种权限,现在是在用的时候,回去问用户同意。

下面介绍一下我们应用在适配6.0的时候,需要做哪些事情吧,

权限添加

这个和之前的做法没有区别:在AndroidManifest中添加

<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.example.snazzyapp">

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

<application ...>
...
</application>

</manifest>
在你声明权限之后,系统的行为取决于你权限的敏感程度,如果这个权限没有影响到用户隐私,系统会自动同意你的权限,如果权限可能影响用户隐私,那系统就会去征询用户的同意了,

检查权限

如果你需要一个危险的权限,就必须每次都检查你是否已经有权限了,所以如果有权限了,我们直接使用就可以了,如果没有那么就申请就好了

int permissionCheck = ContextCompat.checkSelfPermission(thisActivity,
Manifest.permission.WRITE_CALENDAR);
返回值就是是否已经有权限了,如果返回值是PackageManager.PERMISSION_GRANTED,就证明有权限了,如果返回PackageManager.PERMISSION_DENIED,那就证明还没有权限呢,

这是我们就要自己去申请

申请权限

ActivityCompat.requestPermissions(thisActivity,
new String[]{Manifest.permission.READ_CONTACTS},
MY_PERMISSIONS_REQUEST_READ_CONTACTS);
调用这个方法之后,会弹出一个标准的dialog,这个是不能被我们自定义的啊,长啥死样就看各个厂商了。

但是呢,我们可以在弹框之前,单独弹一个窗口,来告诉为什么要申请权限,然后再去弹这个系统框,这样用户就会更加了解你为什么需要这个权限了。

所以我们的完整代码如下:

// Here, thisActivity is the current activity
if (ContextCompat.checkSelfPermission(thisActivity,
Manifest.permission.READ_CONTACTS)
!= PackageManager.PERMISSION_GRANTED) {

if (ActivityCompat.shouldShowRequestPermissionRationale(thisActivity,
Manifest.permission.READ_CONTACTS)) {

// Show an expanation to the user *asynchronously* -- don't block
// this thread waiting for the user's response! After the user
// sees the explanation, try again to request the permission.

} else {

ActivityCompat.requestPermissions(thisActivity,
new String[]{Manifest.permission.READ_CONTACTS},
MY_PERMISSIONS_REQUEST_READ_CONTACTS);

// MY_PERMISSIONS_REQUEST_READ_CONTACTS is an
// app-defined int constant. The callback method gets the
// result of the request.
}
}


上面的大多数方法,我们都已经讲过了,根据注释,也理解了每一段都干了什么,

唯一需要额外说一下的是

ActivityCompat.shouldShowRequestPermissionRationale()

如果我们的应用在之前请求过权限,但是用户拒绝了我们的请求,返回true

如果用户在之前关闭了权限,并且在请求对弹框时,选择了 Don't ask again 选项,返回false
如果设备方针拒绝这个应用拥有这个权限,返回false
上面是google说的几点,下面我再解释成人话,就是说:
我们第一次调用这里,肯定是返回false的,就会弹出来系统弹框,问你同不同意啊,
如果你同意了,以后就没这里什么事了
如果要是不同意呢,以后就会返回true,
那咱们就得弹个框,告诉用户问什么要权限,最好再有个同意按钮
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息