//对分配是否可以阅读联系人的权限的设置。
        if(ContextCompat.checkSelfPermission(MainActivity.this,
                Manifest.permission.READ_CONTACTS)!= PackageManager.PERMISSION_GRANTED){
            ActivityCompat.requestPermissions(MainActivity.this,new String[]
                    {Manifest.permission.READ_CONTACTS},1
            );
        }else{
            ReadContact();
        }
    }
    public void ReadContact(){
        Cursor cursor=null;
        try {
            cursor=getContentResolver().query(ContactsContract.CommonDataKinds.Phone.CONTENT_URI
                    ,null,null,null,null);
            if(cursor!=null) {
                while (cursor.moveToNext()) {
                    String name = cursor.getString(cursor.
                            getColumnIndex(ContactsContract.CommonDataKinds.Phone.DISPLAY_NAME));
                    String number = cursor.getString(cursor.
                            getColumnIndex(ContactsContract.CommonDataKinds.Phone.NUMBER));
                    Contact contact=new Contact(name,number);
                    list.add(contact);
                }
                myAdapter.notifyDataSetChanged();
            }
        }catch (Exception e){
            e.printStackTrace();
        }finally {
            if(cursor!=null){
                cursor.close();
            }
        }
    }
    @Override
    public void onRequestPermissionsResult(int requestCode,
                @NonNull String[] permissions, @NonNull int[] grantResults) {
                switch (requestCode){
                    case 1:
                        if(grantResults.length>0&&grantResults[0]==PackageManager.
                                PERMISSION_GRANTED){
                            ReadContact();
                        }else{
                            Toast.makeText(MainActivity.this,"没有分配足够的权限",
                                    Toast.LENGTH_LONG).show();
                        }
        }
    }

解决方案 »

  1.   

    ContextCompat.checkSelfPermission:判断是否有某个权限,android6.0之后都要动态请求权限。
    Manifest.permission.READ_CONTACTS:读取手机联系人权限
    PackageManager.PERMISSION_GRANTED:权限允许。对应还有PERMISSION_DENIED,权限拒绝。
    ActivityCompat.requestPermissions:请求权限,可以请求一个或多个权限。
    第一句就是判断是否有读取联系人权限,如果没有就去请求。有权限直接读取。ReadContact就是读取联系人列表然后显示处理。
    onRequestPermissionsResult:权限请求结果。请求权限后会弹窗提醒用户是否授予权限,用户点击后会触发当前方法。