unity工程导出android工程打包apk后怎么取消unity中的动态权限申请,并在android工程中动态申请权限?

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都是使用这个主题的。

猜你喜欢

转载自blog.csdn.net/qq_41165567/article/details/104967604