6.0动态请求权限

    xiaoxiao2021-03-25  94

    动态请求权限

    好东西一定要转出来:转自这里 这里以申请打电话动态权限为例: 在6.0上面打电话需要动态请求权限,所以代码又改成这样: [java]  view plain  copy   private final int REQUEST_CODE = 0x1001;   private void testCallPhone() {          if (Build.VERSION.SDK_INT >= 23) {              //判断有没有拨打电话权限           if (PermissionChecker.checkSelfPermission(context, Manifest.permission.CALL_PHONE) != PackageManager.PERMISSION_GRANTED) {                  //请求拨打电话权限               ActivityCompat.requestPermissions(thisnew String[{Manifest.permission.CALL_PHONE}, REQUEST_CODE);              } else {               callPhone("13823214321");           }          } else {           callPhone("13823214321");       }   }         /**   * 请求权限的回调方法   * @param requestCode    请求码   * @param permissions    请求的权限   * @param grantResults   权限的结果   */   @Override   public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {       super.onRequestPermissionsResult(requestCode, permissions, grantResults);          if (requestCode == REQUEST_CODE && PermissionChecker.checkSelfPermission(context, Manifest.permission.CALL_PHONE) == PackageManager.PERMISSION_GRANTED) {           ToastUtils.show(context, "授权成功");           callPhone("13823214321");       }   }      private void callPhone(String phoneNum) {       //直接拨号       Uri uri = Uri.parse("tel:" + phoneNum);       Intent intent = new Intent(Intent.ACTION_CALL, uri);       //此处不判断就会报错       if (ActivityCompat.checkSelfPermission(this, Manifest.permission.CALL_PHONE) == PackageManager.PERMISSION_GRANTED) {              startActivity(intent);       }   }      而跳转到电话界面是这样的: [java]  view plain  copy   //跳转到拨打电话界面   Uri uri = Uri.parse("tel:13876543210");   Intent intent = new Intent(Intent.ACTION_DIAL,uri);   startActivity(intent);       上边的代码看似没问题,不过却需要注意:方法ActivityCompat.requestPermissions();是ActivityCompat中的方法,所以其回调方法onRequestPermissionsResult(int requestCode, @NonNull String[] permissions,@NonNull int[] grantResults);也是回调的ActivityCompat中的, 这就要求: 1.你的activity需要继承 ActivityCompat;  2.你的回调方法onRequestPermissionsResult()也需要写在该activity中;     所以啊,这里需要说明一下,你的监听回调为什么一直不起作用呢,看看它是不是本应该写在activity中的,却写在了fragment中了呢(fragment也是有这两个方法的),因为它调用的根本就不是它所需要的那个ya! But 这样做就可以了吗?其实却还是忽略了一点,弹出的对话框中的那个“拒绝后不在询问”被选上了怎么办,难道以后点击都没有效果了吗?如图: 这个不处理,难免用户体验不是很好啊,那怎么办呢??? 这里只给出3个方案:     1、不去处理 。     2、提示用户自己到“手机设置”中自行开启对应权限(适合少数人)。     3、隐式地打开本应用信息界面,由用户自己手动开启这个权限。 第二个方案很简单,用dialog或popupWindow等都行; 第三个方案主要吊起系统的代码: if (Build.VERSION.SDK_INT >= 23) { //判断有没有拨打电话权限 if (PermissionChecker.checkSelfPermission(getContext(), CALL_PHONE) != PackageManager.PERMISSION_GRANTED) { if (!shouldShowRequestPermissionRationale(CALL_PHONE)) { Intent intent = new Intent(Settings.ACTION_APPLICATION_DETAILS_SETTINGS); //吊起系统管理界面 intent.setData(Uri.parse("package:" + getPackageName())); startActivity(intent); }else { //请求拨打电话权限 ActivityCompat.requestPermissions(getActivity(), new String[]{CALL_PHONE}, REQUEST_CODE); } } else { callPhone((String) SPTools.get(getContext(),Constant.BUTLER_PHONE,"")); } } else { callPhone((String) SPTools.get(getContext(),Constant.BUTLER_PHONE,"")); } 具体请看这篇博文吧: http://www.jianshu.com/p/a51593817825 另外需要动态申请的权限还有: Permission Group Permissions android.permission-group.CALENDAR android.permission.READ_CALENDARandroid.permission.WRITE_CALENDAR android.permission-group.CAMERA android.permission.CAMERA android.permission-group.CONTACTS android.permission.READ_CONTACTSandroid.permission.WRITE_CONTACTSandroid.permission.GET_ACCOUNTS android.permission-group.LOCATION android.permission.ACCESS_FINE_LOCATIONandroid.permission.ACCESS_COARSE_LOCATION android.permission-group.MICROPHONE android.permission.RECORD_AUDIO android.permission-group.PHONE android.permission.READ_PHONE_STATEandroid.permission.CALL_PHONEandroid.permission.READ_CALL_LOGandroid.permission.WRITE_CALL_LOGcom.android.voicemail.permission.ADD_VOICEMAILandroid.permission.USE_SIPandroid.permission.PROCESS_OUTGOING_CALLS android.permission-group.SENSORS android.permission.BODY_SENSORS android.permission-group.SMS android.permission.SEND_SMSandroid.permission.RECEIVE_SMSandroid.permission.READ_SMSandroid.permission.RECEIVE_WAP_PUSHandroid.permission.RECEIVE_MMSandroid.permission.READ_CELL_BROADCASTS android.permission-group.STORAGE android.permission.READ_EXTERNAL_STORAGEandroid.permission.WRITE_EXTERNAL_STORAGE

    注意:一个组的任何一个权限被授权了,其他权限会被自动授权。

    例如:一旦WRITE_EXTERNAL_STORAGE被授权了,app也有READ_EXTERNAL_STORAGE权限了。

    //发短信填入号码   Uri uri = Uri.parse("smsto:" + phone);   Intent sendIntent = new Intent(Intent.ACTION_VIEW, uri);   sendIntent.putExtra("sms_body", subTitle);   context.startActivityForResult(sendIntent, 1002 );   参考地址: http://www.jianshu.com/p/a51593817825        http://blog.csdn.net/a77979744/article/details/53307963

    http://blog.csdn.net/caroline_wendy/article/details/50587230

    转载请注明原文地址: https://ju.6miu.com/read-16351.html

    最新回复(0)