6.0

适配 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
}
}

你可能感兴趣的:(6.0)