群友在做权限申请这发问,哪些权限不能够直接使用,而是需要临时申请的,整理一下,用代码说话。
SMS短信权限
Manifest.permission.SEND_SMS
Manifest.permission.RECEIVE_SMS
Manifest.permission.READ_SMS
Manifest.permission.RECEIVE_WAP_PUSH
Manifest.permission.RECEIVE_MMS
STORAGE存储卡
Manifest.permission.READ_EXTERNAL_STORAGE
Manifest.permission.WRITE_EXTERNAL_STORAGE
CONTACTS联系人权限
Manifest.permission.READ_CONTACTS
Manifest.permission.WRITE_CONTACTS
Manifest.permission.GET_ACCOUNTS
PHONE手机权限
Manifest.permission.READ_PHONE_STATE
Manifest.permission.CALL_PHONE
Manifest.permission.READ_CALL_LOG
Manifest.permission.WRITE_CALL_LOG
Manifest.permission.ADD_VOICEMAIL
Manifest.permission.USE_SIP
Manifest.permission.PROCESS_OUTGOING_CALLS
CALENDAR日历权限
Manifest.permission.READ_CALENDAR
Manifest.permission.WRITE_CALENDAR
CAMERA相机权限
Manifest.permission.CAMERA
LOCATION位置权限
Manifest.permission.ACCESS_FINE_LOCATION
Manifest.permission.ACCESS_COARSE_LOCATION
SENSORS传感器权限
Manifest.permission.BODY_SENSORS
MICROPHONE麦克风权限
Manifest.permission.RECORD_AUDIO
简单整理了一下,方便日后的复制
//短信权限
public static String[] SMS_PERNISSION = { Manifest.permission.RECEIVE_SMS,
Manifest.permission.RECEIVE_SMS,Manifest.permission.READ_SMS,
Manifest.permission.RECEIVE_WAP_PUSH,Manifest.permission.RECEIVE_MMS};
//STORAGE存储卡权限
public static String[] STORAGE_PERNISSION = { Manifest.permission.READ_EXTERNAL_STORAGE,
Manifest.permission.WRITE_EXTERNAL_STORAGE};
//LOCATION位置权限
public static String[] LOCATION_PERNISSION = { Manifest.permission.ACCESS_FINE_LOCATION,
Manifest.permission.ACCESS_COARSE_LOCATION};
//CONTACTS联系人权限
public static String[] CONTACTS_PERNISSION = { Manifest.permission.READ_CONTACTS,
Manifest.permission.WRITE_CONTACTS,Manifest.permission.GET_ACCOUNTS};
//CAMERA相机权限
public static String[] CAMERA_PERNISSION = { Manifest.permission.CAMERA};
权限有了,那么使用也简单说一下吧,能用RxPermission最好,如果不会用,下面是最简单的方式(在activity或fragment中)
1首先确定你需要的权限,因为一般都是几个权限一起完成一个功能,所以我习惯性写成数组的形式。这里以定位举例吧。
2先判断你是否申请过(定位)权限,在第一次打开软件的时候如果你允许了的话,以后的每一次都不需要再进行申请了,相反,如果你拒绝了,一般为以后的每一次还会提醒你。用代码说话。
假定,你要在有权限时实现的方法为a();
首先判断你是不是需要申请权限
private void initPermission() {
//用定位权限进行举例,调用permissionAllGranted方法,判断是否需要申请权限
boolean permission = permissionAllGranted(new String[]{Manifest.permission.ACCESS_COARSE_LOCATION,Manifest.permission.ACCESS_FINE_LOCATION});
if (!permission) {
//没有权限时
//请求权限
ActivityCompat.requestPermissions(this, new String[]{Manifest.permission.ACCESS_COARSE_LOCATION,Manifest.permission.ACCESS_FINE_LOCATION}, 1);
//这里的1为requestCode,你可以写成任意的数字
}else {
//有权限时
a();
}
}
private boolean permissionAllGranted(String[] permissions) {
for (String permission : permissions) {
if (ContextCompat.checkSelfPermission(this, permission) != PackageManager.PERMISSION_GRANTED) {
// 只要有一个权限没有被授予, 则不能完成你需要的功能就返回 false
return false;
}
}
return true;
}
当你申请权限时,系统会自动弹出一个让用户选择是否要授予权限的弹窗,当用户选择完,结果在onRequestPermissionsResult方法中进行返回,这是一个重写的方法。
@Override
public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {
super.onRequestPermissionsResult(requestCode, permissions, grantResults);
if (requestCode == 1 && grantResults.length > 0) {//将这里的requestCode改成你的任意数字,上边的一致就行
boolean granted = grantResults[0] == PackageManager.PERMISSION_GRANTED;//是否授权,可以根据permission作为标记
if(granted){//true为授予了
a();
}else{//
没有授予,比如可以给用户弹窗告诉用户,你拒绝了权限,所以不能实现某个功能,如果想实现你可以跳转到设置,如果不想实现那么直接把这个弹窗取消
}
}
}
Fragment权限的申请
例子实在activity中用的,如果在activity下的Fragment中使用,那么用所在的Fragment,XXFragment.this.requestPermissions(new String[]{Manifest.permission.ACCESS_COARSE_LOCATION,Manifest.permission.ACCESS_FINE_LOCATION}, 1);当你在Fragment下的Fragment时也这么申请
Fragment申请的返回
在Fragment中如果使用ActivityCompat.requestPermissions进行申请,那么你的返回会在你所在的Fragment的Acticity的权限回调方法中返回,所以请在申请时注意了。如果你在Fragment中使用了Fragment的申请方法但是还是没收到返回,那么你是否所在得Fragment被嵌套在另一个FragmentA内?如果有那么看看你的FragmentA的权限回调里是否有,如果有,那么就传递给你需要的Fragment吧,代码我就不写了,百度一搜就有。
不好意思csdn的编辑器我不太会用,格式都乱了。懂了吧,直接复制吧,很简单的。有时间我补一篇RxPermission的。