动态请求权限
好东西一定要转出来:转自这里
这里以申请打电话动态权限为例:
在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(this, new String[{Manifest.permission.CALL_PHONE}, REQUEST_CODE); } else { callPhone("13823214321"); } } else { callPhone("13823214321"); } } @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