适配 Android 6.0 (API level 23)
官方文档的步骤
(我建议你去看文档,不要看我的文章,我是给自己看的)
官方路径:
https://developer.android.com/training/permissions/requesting.html
1、检查权限
int permissionCheck =ContextCompat.checkSelfPermission(thisActivity,
Manifest.permission.READ_CONTACTS);
这里的permissionCheck只有两个返回值:
(1)PackageManager.PERMISSION_GRANTED,app已经有了这个权限,你想干嘛就继续干下去吧,下面的文章也不用看;
(2) PERMISSION_DENIED,app还没有权限呢,这时候你就惨了,一系列的问题要处理,往下看吧;
2、注册权限
由于上一步检查到APP还没有权限读联系人,所以我就要引导用户允许这个权限。
(1)提醒用户
提醒用户,要读取用户的联系人信息来做坏事了,噢,不是啦,帮用户找到用这个APP的好友啦。
activity的话可以调用:
boolean shouldShow=ActivityCompat.shouldShowRequestPermissionRationale(myActivity, perm);
fragment的话可以调用:
boolean shouldShow=myFragment.shouldShowRequestPermissionRationale(perm);
拿shouldShow的值来说:
返回true,就是APP在之前已经向用户申请过这个权限了,但是被用户狠心的拒绝了。
返回false,更加严重,APP之前向用户申请读取联系人的时候,用户不单单拒绝了还选择了“不要再提醒了”,或者是你在系统的设置里对APP关闭了权限。
所以这句也是在获取不到权限的情况下,应该作为第一条语句执行。跟用户解释下为啥要用这个权限呢,因为之前可能用户不理解。
(2)正式注册
requestPermissions();
上面那一步提示无论执行,或者没有执行,接下来都需要调用requestPermissions()弹个框给用户选择,这个才是真正目的。上面就是一个提示而已,给用户看看,没啥鸟用。
3、整个流程
// Here, thisActivity is the current activity
if (ContextCompat.checkSelfPermission(thisActivity,
Manifest.permission.READ_CONTACTS)
!= PackageManager.PERMISSION_GRANTED) {
// Should we show an explanation?
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 {
// No explanation needed, we can request the permission.
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.
}
}
4、那我怎么知道用户对框的操作
调用activity或者fragment的onRequestPermissionsResult()方法:
public void onRequestPermissionsResult(int requestCode,
String permissions[], int[] grantResults) {
switch (requestCode) {
case MY_PERMISSIONS_REQUEST_READ_CONTACTS: {
// If request is cancelled, the result arrays are empty.
if (grantResults.length > 0
&& grantResults[0] == PackageManager.PERMISSION_GRANTED) {
// permission was granted, yay! Do the
// contacts-related task you need to do.
} else {
// permission denied, boo! Disable the
// functionality that depends on this permission.
}
return;
}
// other 'case' lines to check for other
// permissions this app might request
}
}
网友评论