1.在android工程中的主activity的minifast中添加:
<meta-data android:name="unityplayer.SkipPermissionsDialog" android:value="true" />
2.在android工程的**任意activity(看需求)**中动态申请权限:
if (Build.VERSION.SDK_INT >= 23) {
ActivityCompat.requestPermissions(this, new String[]{
Manifest.permission.WRITE_EXTERNAL_STORAGE,Manifest.permission.READ_PHONE_STATE}, 0);
}
else {
}
3.在动态申请权限的activity中重写onRequestPermissionsResult方法,在此方法中可以获取用户在权限申请界面点击的是”始终允许“或者”禁止“或者”禁止不再询问“按钮:
@Override
public void onRequestPermissionsResult(int requestCode, String[] permissions, int[] grantResults){
super.onRequestPermissionsResult(requestCode, permissions, grantResults);
if (requestCode == 0) {
for (int i = 0; i < permissions.length; i++) {
if (grantResults[i] == PackageManager.PERMISSION_GRANTED) {
//选择了“始终允许”
Toast.makeText(this, "" + "权限" + permissions[i] + "申请成功", Toast.LENGTH_SHORT).show();
}
else {
if (!ActivityCompat.shouldShowRequestPermissionRationale(this, permissions[i])){
//用户选择了禁止不再询问
new AlertDialog.Builder(SDKCore.getInstance().getContext())
.setTitle("權限設置")
.setMessage("需要讀取手機存儲權限以及讀取手機信息權限,否則部分遊戲功能不能正常使用")
.setPositiveButton("去設置", new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
PermissionUtil.gotoPermission(SDKCore.getInstance().getContext());
}
})
.setNegativeButton("取消", new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
}
})
.create().show();
}
}
}
}
else{
Toast.makeText(this, "" + "权限申请结果", Toast.LENGTH_SHORT).show();
}
}
4.上线google时:要求应用在申请权限前要弹出一个提示用户权限的使用说明框,并且此提示框在用户已授权的情况下不会再弹出,当用户点击“禁止不在询问”后需要弹出一个提示用户去设置手机权限的框,此框有“取消”和“去设置”按钮,当点击“去设置”的按钮时需要跳转到手机的权限设置界面授权:
import android.content.ComponentName;
import android.content.Context;
import android.content.Intent;
import android.net.Uri;
import android.os.Build;
import android.text.TextUtils;
import com.example.geigei_android.BuildConfig;
/**
* author:zh
* date:2019/5/21
*/
public class PermissionUtil {
public static void gotoPermission(Context context) {
String brand = Build.BRAND;//手机厂商
if (TextUtils.equals(brand.toLowerCase(), "redmi") || TextUtils.equals(brand.toLowerCase(), "xiaomi")) {
PermissionUtil.gotoMiuiPermission(context);//小米
} else if (TextUtils.equals(brand.toLowerCase(), "meizu")) {
PermissionUtil.gotoMeizuPermission(context);
} else if (TextUtils.equals(brand.toLowerCase(), "huawei") || TextUtils.equals(brand.toLowerCase(), "honor")) {
PermissionUtil.gotoHuaweiPermission(context);
} else {
context.startActivity(PermissionUtil.getAppDetailSettingIntent(context));
}
}
/**
* 跳转到miui的权限管理页面
*/
private static void gotoMiuiPermission(Context context) {
try {
// MIUI 8
Intent localIntent = new Intent("miui.intent.action.APP_PERM_EDITOR");
localIntent.setClassName("com.miui.securitycenter", "com.miui.permcenter.permissions.PermissionsEditorActivity");
localIntent.putExtra("extra_pkgname", context.getPackageName());
context.startActivity(localIntent);
} catch (Exception e) {
try {
// MIUI 5/6/7
Intent localIntent = new Intent("miui.intent.action.APP_PERM_EDITOR");
localIntent.setClassName("com.miui.securitycenter", "com.miui.permcenter.permissions.AppPermissionsEditorActivity");
localIntent.putExtra("extra_pkgname", context.getPackageName());
context.startActivity(localIntent);
} catch (Exception e1) {
// 否则跳转到应用详情
context.startActivity(getAppDetailSettingIntent(context));
}
}
}
/**
* 跳转到魅族的权限管理系统
*/
private static void gotoMeizuPermission(Context context) {
try {
Intent intent = new Intent("com.meizu.safe.security.SHOW_APPSEC");
intent.addCategory(Intent.CATEGORY_DEFAULT);
intent.putExtra("packageName", BuildConfig.APPLICATION_ID);
context.startActivity(intent);
} catch (Exception e) {
e.printStackTrace();
context.startActivity(getAppDetailSettingIntent(context));
}
}
/**
* 华为的权限管理页面
*/
private static void gotoHuaweiPermission(Context context) {
try {
Intent intent = new Intent();
intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
ComponentName comp = new ComponentName("com.huawei.systemmanager", "com.huawei.permissionmanager.ui.MainActivity");//华为权限管理
intent.setComponent(comp);
context.startActivity(intent);
} catch (Exception e) {
e.printStackTrace();
context.startActivity(getAppDetailSettingIntent(context));
}
}
/**
* 获取应用详情页面intent(如果找不到要跳转的界面,也可以先把用户引导到系统设置页面)
*/
private static Intent getAppDetailSettingIntent(Context context) {
Intent localIntent = new Intent();
localIntent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
localIntent.setAction("android.settings.APPLICATION_DETAILS_SETTINGS");
localIntent.setData(Uri.fromParts("package", context.getPackageName(), null));
return localIntent;
}
}
5.注意:Android中的普通弹框AlertDialog有两个,一个在android.app库中,另一个在android.support.v7库中,要用第一个,不要用第二个,因为有的项目没有引入android.support.v7的时候,你AlertDialog弹出一个框的时候会造成客户端闪退,报错的大概意思是:需要你的项目android:theme使用appconpact主题。
说到appconpact主题,其实google要求新的项目中必须使用这个appconpact主题,这是最新的主题,主要是android10以后的UI都是使用这个主题的。