美文网首页Android开发常用代码
Android6.0动态权限处理方案

Android6.0动态权限处理方案

作者: 才兄说 | 来源:发表于2017-06-17 17:25 被阅读506次

    Android7.0临时权限问题处理

    框架封装使用:统一处理了动态申请及结果处理的重复代码,让使用者的注意力更多集中在业务逻辑上,而动态权限申请的关注点在请求码上,只要注解上请求码匹配就可以执行该方法。(请求码、方法都可以自定义,关键是码值一致)

    源码戳这里

    1.
    PermissionGen.needPermission(this, 200,
            Manifest.permission.CAMERA,
            Manifest.permission.RECORD_AUDIO,
            Manifest.permission.WRITE_EXTERNAL_STORAGE);
    或
    PermissionGen.with(MainActivity.this)
            .addRequestCode(100)
            .permissions(
                    Manifest.permission.READ_CONTACTS,
                    Manifest.permission.RECEIVE_SMS,
                    Manifest.permission.WRITE_CONTACTS)
            .request();
    
    2.
    @Override
    public void onRequestPermissionsResult(int requestCode, String[] permissions,
                                           int[] grantResults) {
        PermissionGen.onRequestPermissionsResult(this, requestCode, permissions, grantResults);
    }
    
    3.
    @PermissionSuccess(requestCode = 200)
    public void openCamera() {
        Debug.d("openCamera");
    }
    
    @PermissionFail(requestCode = 200)
    public void failOpenCamera() {
        Debug.d("failOpenCamera");
    }
    
    简单使用:如下整理了一份使用样例,保留了动态权限申请及申请结果处理演示

    下面提供一份整理测试过的代码:(仅供参考,具体封装需要自行处理)

    public class PermissionTestActivity extends AppCompatActivity {
    
        @Override
        protected void onCreate(@Nullable Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.my_test_activity);
        }
    
        private static final int MY_PERMISSIONS_REQUEST_CAMERA = 1;
    
        //执行测试方法
        public void doClick(View view) {
            if (ContextCompat.checkSelfPermission(this,
                    Manifest.permission.CAMERA)
                    != PackageManager.PERMISSION_GRANTED) {
                ActivityCompat.requestPermissions(this,
                        new String[]{Manifest.permission.CAMERA},
                        MY_PERMISSIONS_REQUEST_CAMERA);
            } else {
                //用户已经允许弹出权限请求
                callPhone();
            }
        }
    
        //拨打电话
        public void callPhone() {
            Intent intent = new Intent(Intent.ACTION_CALL);
            Uri data = Uri.parse("tel:" + "10086");
            intent.setData(data);
            if (ActivityCompat.checkSelfPermission(this, Manifest.permission.CALL_PHONE) != PackageManager.PERMISSION_GRANTED) {
                return;
            }
            startActivity(intent);
        }
        
        @Override
        public void onRequestPermissionsResult(int requestCode, String[] permissions, int[] grantResults) {
    
            if (requestCode == MY_PERMISSIONS_REQUEST_CAMERA) {
                if (grantResults[0] != PackageManager.PERMISSION_GRANTED) {
                    boolean isTip = ActivityCompat.shouldShowRequestPermissionRationale(this, permissions[0]);
                    if (isTip) {
                        //用户取消权限请求,并没有彻底禁止弹出权限请求
                        AlertDialog.Builder dialog = new AlertDialog.Builder(PermissionTestActivity.this);
                        dialog.setCancelable(false);
                        dialog.setMessage("权限使用解释");
                        dialog.setPositiveButton("确定", new DialogInterface.OnClickListener() {
                            @Override
                            public void onClick(DialogInterface dialog, int which) {
                                //再次请求权限
                                ActivityCompat.requestPermissions(PermissionTestActivity.this,
                                        new String[]{Manifest.permission.CAMERA},
                                        MY_PERMISSIONS_REQUEST_CAMERA);
                            }
                        });
                        dialog.setNeutralButton("取消", new DialogInterface.OnClickListener() {
                            @Override
                            public void onClick(DialogInterface arg0, int arg1) {
                                arg0.dismiss();
                            }
                        });
                        dialog.show();
    
                    } else {
                        //用户彻底禁止弹出权限请求
    
                        //进入权限设置界面
                        Uri packageURI = Uri.parse("package:" + "kr.co.namee.permissiongen_sample");
                        Intent intent = new Intent(Settings.ACTION_APPLICATION_DETAILS_SETTINGS, packageURI);
                        startActivity(intent);
                    }
    
                } else {
                    //用户允许弹出权限请求
                    callPhone();
                }
                return;
            }
            super.onRequestPermissionsResult(requestCode, permissions, grantResults);
        }
    
    }
    
    补充:

    通用权限,该类权限不涉及用户隐私(Normal Permissions)

    ACCESS_LOCATION_EXTRA_COMMANDS
    ACCESS_NETWORK_STATE
    ACCESS_NOTIFICATION_POLICY
    ACCESS_WIFI_STATE
    BLUETOOTH
    BLUETOOTH_ADMIN
    BROADCAST_STICKY
    CHANGE_NETWORK_STATE
    CHANGE_WIFI_MULTICAST_STATE
    CHANGE_WIFI_STATE
    DISABLE_KEYGUARD
    EXPAND_STATUS_BAR
    GET_PACKAGE_SIZE
    INSTALL_SHORTCUT
    INTERNET
    KILL_BACKGROUND_PROCESSES
    MODIFY_AUDIO_SETTINGS
    NFC
    READ_SYNC_SETTINGS
    READ_SYNC_STATS
    RECEIVE_BOOT_COMPLETED
    REORDER_TASKS
    REQUEST_INSTALL_PACKAGES
    SET_ALARM
    SET_TIME_ZONE
    SET_WALLPAPER
    SET_WALLPAPER_HINTS
    TRANSMIT_IR
    UNINSTALL_SHORTCUT
    USE_FINGERPRINT
    VIBRATE
    WAKE_LOCK
    WRITE_SYNC_SETTINGS
    

    危险权限,该类权限涉及用户隐私(Dangerous Permissions)

    group:android.permission-group.CONTACTS
      permission:android.permission.WRITE_CONTACTS
      permission:android.permission.GET_ACCOUNTS
      permission:android.permission.READ_CONTACTS
    
    group:android.permission-group.PHONE
      permission:android.permission.READ_CALL_LOG
      permission:android.permission.READ_PHONE_STATE
      permission:android.permission.CALL_PHONE
      permission:android.permission.WRITE_CALL_LOG
      permission:android.permission.USE_SIP
      permission:android.permission.PROCESS_OUTGOING_CALLS
      permission:com.android.voicemail.permission.ADD_VOICEMAIL
    
    group:android.permission-group.CALENDAR
      permission:android.permission.READ_CALENDAR
      permission:android.permission.WRITE_CALENDAR
    
    group:android.permission-group.CAMERA
      permission:android.permission.CAMERA
    
    group:android.permission-group.SENSORS
      permission:android.permission.BODY_SENSORS
    
    group:android.permission-group.LOCATION
      permission:android.permission.ACCESS_FINE_LOCATION
      permission:android.permission.ACCESS_COARSE_LOCATION
    
    group:android.permission-group.STORAGE
      permission:android.permission.READ_EXTERNAL_STORAGE
      permission:android.permission.WRITE_EXTERNAL_STORAGE
    
    group:android.permission-group.MICROPHONE
      permission:android.permission.RECORD_AUDIO
    
    group:android.permission-group.SMS
      permission:android.permission.READ_SMS
      permission:android.permission.RECEIVE_WAP_PUSH
      permission:android.permission.RECEIVE_MMS
      permission:android.permission.RECEIVE_SMS
      permission:android.permission.SEND_SMS
      permission:android.permission.READ_CELL_BROADCASTS
    

    相关文章

      网友评论

      • 虎皮猫大人22:有几个地方有点小问题
        1: 是 Manifest.permission.CALL_PHONE 而不是 Manifest.permission.CAMERA
        2:
        点击 按钮
        -- 在弹出的权限框, 选择 拒绝
        -- 然后在弹出框选择 确定
        -- 在弹出的权限框, 勾选 不再询问 , 拒绝
        然后 在设置界面, 打开 拨打电话的权限, 返回主界面,
        无法拨打 电话,

      本文标题:Android6.0动态权限处理方案

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