1.首先确定你要申请的权限
可以定义成一个数组:如
protected String[] needPermissions = {
Manifest.permission.WRITE_EXTERNAL_STORAGE,//存储卡写入权限
Manifest.permission.READ_EXTERNAL_STORAGE,//存储卡读取权限
Manifest.permission.READ_PHONE_STATE,//读取手机状态权限
};
上诉权限是一个常量字符串,需要引入 import android.Manifest;
2.检测权限有没有获取到,找出没获取到的去申请
private List
checkGamePer(){
Listarr = new ArrayList ();
for (String perm : needPermissions) {//this参数要activity
if (ContextCompat.checkSelfPermission(this, perm) != PackageManager.PERMISSION_GRANTED ) {
arr.add(perm);
}
}
return arr;
}
List
arr = checkGamePer();
if (arr.size()>0) {
// 还有权限没申请到,则申请权限, this参数要activity
ActivityCompat.requestPermissions(this, arr.toArray(new String[arr.size()]), 1);
} else {
//权限都申请到了,直接做你想做的事
}
3.玩家点击同意或者拒绝权限后会回调,在上诉this的activity中注册回调函数
- public void onRequestPermissionsResult(int requestCode, String[] permissions, int[] grantResults) {
- if (requestCode == 1) {
- Boolean flag = true;
- for (int i = 0; i < permissions.length; i++) {
- if (grantResults[i] != PackageManager.PERMISSION_GRANTED) {//选择了“始终允许”
- flag = false;
- }
- }
- if (flag) {
- //申请成功
-
- } else {
- //失败 退出游戏
- finish();
- }
- }
- }
这里的requestCode就是请求权限时,传入的参数
写法2
- //请求权限
- protected List
mNeedRequestPMSList = new ArrayList<>(); -
- void checkAndRequestPermissions(int requestCode) {
-
- if(Build.VERSION.SDK_INT >= 23 &&
- PackageManager.PERMISSION_GRANTED != ActivityCompat.checkSelfPermission(MainActivity.activity,Manifest.permission.READ_PHONE_STATE)){
- mNeedRequestPMSList.add(Manifest.permission.READ_PHONE_STATE);
- }
- checkAndRequestPermissionsEnd(Constants.REQUEST_PERMISSIONS_CODE_ViVo);
- }
- /**检测权限结束 */
- private void checkAndRequestPermissionsEnd(int requestCode){
- if (0 == mNeedRequestPMSList.size()) {
- /**
- * 权限都已经有了
- */
- permissionInit();
- } else {
- /**
- * 有权限需要申请,主动申请。
- */
- String[] temp = new String[mNeedRequestPMSList.size()];
- mNeedRequestPMSList.toArray(temp);
- ActivityCompat.requestPermissions(MainActivity.activity, temp, requestCode);
- }
- }
- public void onRequestPermissionsResult(int requestCode, String[] permissions, int[] grantResults) {
- //是否用户都点了允许
- Boolean flag = true;
- for (int i = 0; i < permissions.length; i++) {
- if (grantResults[i] != PackageManager.PERMISSION_GRANTED) {//选择了“始终允许”
- flag = false;
- }
- }
- switch (requestCode) {
- case Constants.REQUEST_PERMISSIONS_CODE_OPPO:
- if (flag) {
- ChannelMain.getInstance().agreePermission();
- } else {
- /**
- * 如果用户没有授权,那么应该说明意图,引导用户去设置里面授权。
- */
- Toast.makeText(this, "应用缺少SDK运行必须的READ_PHONE_STATE权限!请点击\"应用权限\",打开所需要的权限。", Toast.LENGTH_LONG).show();
- Intent intent = new Intent(Settings.ACTION_APPLICATION_DETAILS_SETTINGS);
- intent.setData(Uri.parse("package:" + getPackageName()));
- startActivity(intent);
- finish();
- }
- break;
- default:
- break;
- }
- }