Android6.0 运行时权限

官方运行时权限请求方法

  • 运行时权限
    核心方法 (需Android 6.0 (API level 23)及以上)
    检查是否已获得系统权限

    context.checkPermission(permission, Process.myPid(), Process.myUid())
    
  • 请求指定的系统权限:会弹出系统的对话框

    activity.requestPermissions(permissions, requestCode);
    fragment.requestPermissions(permissions, requestCode);
    
  • 检查是否需要弹出开发者自定义的对话框:
    用户拒绝使用权限后,再次点击请求操作(如拍照)时,弹出开发者自定义的对话框;

     // 用户拒绝使用权限后,再次点击请求操作(如拍照)时,返回true;
     // 用户第一次请求权限时,返回false; 
     activity.shouldShowRequestPermissionRationale(permission);
     fragment.shouldShowRequestPermissionRationale(perm);
    

使用第三方框架处理运行时权限(EasyPermissions)

GitHub源码地址

用法(以读取短信总数为例)

public class MainActivity extends AppCompatActivity 
implements EasyPermissions.PermissionCallbacks //实现EasyPermissions接口并重写方法
{

    // 请求码  
    public static final int CODE_READ_SMS = 0;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
    }

    public void onclick(View view) {
        readSmsCount();
    }

    /**
     * 读取短信
     * 需要注入注解 (参数: 自定义的请求码)
     */
    @AfterPermissionGranted(CODE_READ_SMS)
    public void readSmsCount() {
        String[] perms = new String[] {
                Manifest.permission.READ_SMS,
                Manifest.permission.READ_EXTERNAL_STORAGE
        };

        // 判断是否有权限
        // this: 当前Activity,Activity需要实现接口EasyPermissions.PermissionCallbacks
        if (EasyPermissions.hasPermissions(this, perms)) {
            // 有权限,就可以读取短信了
            // AsyncQueryHandler
            int count = -1;
            Cursor cursor = getContentResolver().query(Uri.parse("content://sms"),
                    null, null, null, null);
            if (cursor != null) {
                count =  cursor.getCount();
                cursor.close();
            }
            Toast.makeText(this, "短信条数:" + count, Toast.LENGTH_SHORT).show();

        } else {
            // 没权限,则需要请求权限
            // 参数1:传当前Activity
            // 参数2:当首次请求权限被拒绝时再次请求时提示的信息
            // 参数3:自定义的请求码 
            // 参数4:权限
            EasyPermissions.requestPermissions(this,
                    "此操作要用到短信权限...",
                    CODE_READ_SMS, perms);
        }
    }

    // 用户点击了同意时调用
    @Override
    public void onPermissionsGranted(int requestCode, List perms) {
        System.out.println("-----------------用户点击了同意");
    }

    // 用户点击了拒绝时调用
    @Override
    public void onPermissionsDenied(int requestCode, List perms) {
        System.out.println("-----------------用户点击了拒绝");
    }

    // 用户点击了同意或者拒绝时都会调用此方法
    @Override
    public void onRequestPermissionsResult(int requestCode,
                                           @NonNull String[] permissions,
                                           @NonNull int[] grantResults) {
        super.onRequestPermissionsResult(requestCode, permissions, grantResults);
        EasyPermissions.onRequestPermissionsResult(requestCode, permissions, grantResults, this);
        System.out.println("-----------------onRequestPermissionsResult");
    }
}

附:

  • 权限申请官方文档
    https://developer.android.com/training/permissions/index.html 需要科学上网

  • 开源项目
    https://github.com/googlesamples/easypermissions
    https://github.com/Karumi/Dexter
    https://github.com/hotchemi/PermissionsDispatcher

你可能感兴趣的:(笔记)