简单易懂的 android6.0 动态权限

2017-10-23  本文已影响0人  geaosu
1.在AndroidManifest文件中添加需要的权限。
    <uses-permission android:name="android.permission.CALL_PHONE" />
2.检查权限
    if (ContextCompat.checkSelfPermission(thisActivity, Manifest.permission.READ_CONTACTS) != PackageManager.PERMISSION_GRANTED) {
        //
    }else{
        //
    }
    这里涉及到一个API,ContextCompat.checkSelfPermission,主要用于检测某个权限是否已经被授予,方法返回值为PackageManager.PERMISSION_DENIED或者PackageManager.PERMISSION_GRANTED。当返回DENIED就需要进行申请授权了。
    
3.申请授权
    //参1:context对象, 参2:权限组,  参3:请求码-requestCode
    ActivityCompat.requestPermissions(
        thisActivity, 
        new String[]{
            Manifest.permission.READ_CONTACTS
        },
        MY_PERMISSIONS_REQUEST_READ_CONTACTS
    );  
    
    该方法是异步的,
    第一个参数是Context;
    第二个参数是需要申请的权限的字符串数组;
    第三个参数为requestCode,主要用于回调的时候检测。可以从方法名requestPermissions以及第二个参数看出,是支持一次性申请多个权限的,系统会通过对话框逐一询问用户是否授权。
    
    //上文中的MY_PERMISSIONS_REQUEST_READ_CONTACTS是一个int类型的常量, 当前的值为1;

4.处理权限申请回调
    //参1    参2     参3
    @Override
    public void onRequestPermissionsResult(int requestCode, String permissions[], int[] grantResults) {
        switch (requestCode) {
            case MY_PERMISSIONS_REQUEST_READ_CONTACTS: {
                // 如果请求被取消,结果数组是空的。
                if (grantResults.length > 0 && grantResults[0] == PackageManager.PERMISSION_GRANTED) {
                    // 权限被允许
                } else {
                    // 权限被拒绝
                }
                return;
            }
        }
    }
    

    // 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.

    }
    这个API主要用于给用户一个申请权限的解释,该方法只有在用户在上一次已经拒绝过你的这个权限申请。也就是说,用户已经拒绝一次了,你又弹个授权框,你需要给用户一个解释,为什么要授权,则使用该方法。    
    
    
    
    
    
5.总结:

    // 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.
        }
    }
    
    
    
    
    
案例(android6.0以后的拨打电话功能):

    //打电话按钮
    public void testCall(View view){
        //判断是否有权限
        if (ContextCompat.checkSelfPermission(this, Manifest.permission.CALL_PHONE) != PackageManager.PERMISSION_GRANTED){
            //没有权限, 申请权限
            ActivityCompat.requestPermissions(this, new String[]{Manifest.permission.CALL_PHONE}, MY_PERMISSIONS_REQUEST_CALL_PHONE);
        } else{
            //有权限
            callPhone();
        }
    }

    public void callPhone(){
        Intent intent = new Intent(Intent.ACTION_CALL);
        Uri data = Uri.parse("tel:" + "10086");
        intent.setData(data);
        startActivity(intent);
    }

    //申请权限的结果
    @Override
    public void onRequestPermissionsResult(int requestCode, String[] permissions, int[] grantResults){
        //判断请求码是不是我们定义的请求码
        if (requestCode == MY_PERMISSIONS_REQUEST_CALL_PHONE){
            //是我们请求的权限, 判断权限是否请求成功
            if (grantResults[0] == PackageManager.PERMISSION_GRANTED){
                //权限请求成功
                callPhone();
            } else{
                //权限请求失败, 被拒绝
                Toast.makeText(MainActivity.this, "无法使用该功能, 权限被拒绝, 请前往设置中心授权", Toast.LENGTH_SHORT).show();
            }
            return;
        }
        super.onRequestPermissionsResult(requestCode, permissions, grantResults);
    }

本文借鉴了 "张鸿洋" 大神的博客,
他本人原文地址: http://blog.csdn.net/lmj623565791/article/details/50709663
他本人博客地址: http://my.csdn.net/lmj623565791

上一篇 下一篇

猜你喜欢

热点阅读