美文网首页
Android 6.0 运行时权限讲解(一)

Android 6.0 运行时权限讲解(一)

作者: 冉冉升起的小太阳 | 来源:发表于2017-03-16 16:01 被阅读63次
    Paste_Image.png

    普通权限

    举栗子:
       <uses-permission android:name="android.permission.INTERNET"/> 
    

    危险权限

    举个栗子:
        <!--相机-->
        <uses-permission android:name="android.permission.CAMERA"/>
        <!--发短信-->
        <uses-permission android:name="android.permission.SEND_SMS"/>
    

    罗列危险权限 用时查看就好

    日历数据
    android.permission-group.CALENDAR    
    android.permission.READ_CALENDAR
    android.permission.WRITE_CALENDAR
    相机
    android.permission-group.CAMERA    
    android.permission.CAMERA
    联系人
    android.permission-group.CONTACTS    
    android.permission.READ_CONTACTS
    android.permission.WRITE_CONTACTS
    android.permission.GET_ACCOUNTS
    位置
    android.permission-group.LOCATION    
    android.permission.ACCESS_FINE_LOCATION
    android.permission.ACCESS_COARSE_LOCATION
    麦克风
    android.permission-group.MICROPHONE    
    android.permission.RECORD_AUDIO
    电话
    android.permission-group.PHONE    
    android.permission.READ_PHONE_STATE
    android.permission.CALL_PHONE
    android.permission.READ_CALL_LOG
    android.permission.WRITE_CALL_LOG
    com.android.voicemail.permission.ADD_VOICEMAIL
    android.permission.USE_SIP
    android.permission.PROCESS_OUTGOING_CALLS
    传感器
    android.permission-group.SENSORS    
    android.permission.BODY_SENSORS
    短信
    android.permission-group.SMS    
    android.permission.SEND_SMS
    android.permission.RECEIVE_SMS
    android.permission.READ_SMS
    android.permission.RECEIVE_WAP_PUSH
    android.permission.RECEIVE_MMS
    android.permission.READ_CELL_BROADCASTS
    存储
    android.permission-group.STORAGE    
    android.permission.READ_EXTERNAL_STORAGE
    android.permission.WRITE_EXTERNAL_STORAGE
    

    开启实战

    //拨打电话代码
        public void click(View view){
            Intent intent = new Intent(Intent.ACTION_CALL);
            intent.setData(Uri.parse("1234567890"));
            startActivity(intent);
        }
    

    注意:

    a)
     minSdkVersion 16
     targetSdkVersion 21
    //现在是5.0指定的系统 那么现在要执行拨打电话是可以通过的
    
    b)
    //从低版本升级到 6.0系统 没有卸载
     minSdkVersion 16
     targetSdkVersion 23
    //现在是6.0指定的系统 那么现在要执行拨打电话是可以通过的 
    //问题来了 为什么升级到6.0还可以拨打电话呢!
    //因为 你是从5.0升级到6.0版本系统默认为你已经 勾选权限了。所以要卸载后从新安装
    

    卸载安装后再次运行Log截图

    Paste_Image.png

    简单写法

    public class MainActivity extends AppCompatActivity {
        private static final String TAG = "fenglang";
        @Override
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.activity_main);
        }
    
        public void click(View view) {
            if (ContextCompat.checkSelfPermission(this, Manifest.permission.CALL_PHONE) != PackageManager.PERMISSION_GRANTED) { //判断权限是否被申请
                /**
                 * 第一个参数是  activity 实例
                 * 第二个参数是  premission[] 数组
                 * 第三个参数是  requestCode: 请求的参数
                 */
                ActivityCompat.requestPermissions(this, new String[]{Manifest.permission.CALL_PHONE}, 1);
            } else {
                mackCall();
            }
        }
    
        /**
         * 拨打电话
         */
        private void mackCall() {
            try {
                Intent intent = new Intent(Intent.ACTION_CALL);
                intent.setData(Uri.parse("1234567890"));
                startActivity(intent);
            } catch (SecurityException e) {
                e.printStackTrace();
            }
        }
    
        /**
         *
         * @param requestCode 请求参数 对应上面 1
         * @param permissions 请求的权限 对应上面的 Manifest.permission.CALL_PHONE
         * @param grantResults 返回的结果 有两个结果  # 0 PERMISSION_GRANTED 同意授权  # -1 PERMISSION_DENIED 取消授权
         */
        @Override
        public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {
            super.onRequestPermissionsResult(requestCode, permissions, grantResults);
            switch (requestCode) {
                case 1:
                    if (grantResults.length > 0 && grantResults[0] == PackageManager.PERMISSION_GRANTED) {
                        Log.e(TAG, "onRequestPermissionsResult:  同意权限申请");
                        mackCall();
                    } else {
                        Log.e(TAG, "onRequestPermissionsResult:  不同意权限申请");
                    }
                    break;
                default:
    
                    break;
    
            }
        }
    }
    
    Paste_Image.png

    多个权限

     public class MainActivity extends AppCompatActivity {
        private static final String TAG = "fenglang";
        @Override
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.activity_main);
        }
    
        /**
         * 一次授权多个权限
         * 有几个权限就需要if 判断几次 
         */
        public void  permissionsClick(){
            List<String> permissionList = new ArrayList<>();
            //拨打电话权限
            if(ContextCompat.checkSelfPermission(this,Manifest.permission.CALL_PHONE ) != PackageManager.PERMISSION_GRANTED ){
            permissionList.add(Manifest.permission.CALL_PHONE);
            }
            //访问sd卡权限
            if(ContextCompat.checkSelfPermission(this,Manifest.permission.WRITE_EXTERNAL_STORAGE) != PackageManager.PERMISSION_GRANTED){
                permissionList.add(Manifest.permission.WRITE_EXTERNAL_STORAGE);
            }
            if (permissionList.isEmpty()) {
                ActivityCompat.requestPermissions(this, permissionList.toArray(new String[permissionList.size()]), 1);
            }else {
                Log.e(TAG, "权限授权了,可以啪啪了" );
            }
    
        }
    
        /**
         *
         * @param requestCode 请求参数 对应上面 1
         * @param permissions 请求的权限 对应上面的 Manifest.permission.CALL_PHONE
         * @param grantResults 返回的结果 有两个结果  # 0 PERMISSION_GRANTED 同意授权  # -1 PERMISSION_DENIED 取消授权
         */
        @Override
        public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {
            super.onRequestPermissionsResult(requestCode, permissions, grantResults);
            switch (requestCode){
                case 1:
                    if (grantResults.length > 0){
                        for (int grantResult : grantResults){
                            Log.e(TAG, "onRequestPermissionsResult: 某个权限被拒绝了" );
                            return;
                        }
                    }else{
                        Log.e(TAG, "onRequestPermissionsResult: 所有权限通过" );
                    //相应的操作
                    }
                    break;
            }
        }
    }
    
    
    注意 配置文件一定要写
    
        <uses-permission android:name="android.permission.INTERNET"/>
        <!--相机-->
        <uses-permission android:name="android.permission.CAMERA"/>
        <!--发短信-->
        <uses-permission android:name="android.permission.SEND_SMS"/>
        <!--打电话-->
        <uses-permission android:name="android.permission.CALL_PHONE"/>
        <!--访问SD卡-->
        <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>
    

    小节

    很多人认为访问SD卡是一个很正常权限,那么 这么平常权限,我不想写,还想用那怎么写的

    Paste_Image.png

    SD卡路径: Android/data/com.baidu.mm/cache

         //文件属于缓存文件 会清理软件当做垃圾给清理
            File file =  getExternalCacheDir();
            file.getPath();
            // # 给一个""空是在file 下操作 如果给了 "abc" 就会在file/abc 文件操作
            File files = getExternalFilesDir("");
    

    相关文章

      网友评论

          本文标题:Android 6.0 运行时权限讲解(一)

          本文链接:https://www.haomeiwen.com/subject/zlndnttx.html