前天我们项目有这么个需求,台湾版本由于要上谷歌Play要求安卓系统6.0以上的动态申请权限,对于一个做Unity的来说,是不是有点懵逼,这我该何去何从呢?我想静静,静静的想一想,权限也不就那么点事吗?这算是事吗?这都不是事,遇到问题,不要急着去解决,这里不是不解决,是不要着急为了解决而解决!软件工程告诉我们需求分析才是第一位的,大学都觉的软件工程是很扯淡的课,其实不然,它是灰常重要的,灰常重要,灰常重要!!!重要的事情说三变。再复习下软件工程的几个步骤:需求分析->概要设计->详细设计->码代码->测试->维护!上课基本听老师扯淡了,大致是这么个流程!!!

Q1:我怎么知道的APK到底有多少个权限?
A1:这里我要引用我们策划经常说的一句话了,“小伙子,这个问题问的好!”。作为一个懂开发的猿,这个要是不知道,我也不知道该不该说你了。。。AndroidManifest.xml这个你眼熟吧?不错,是你是你就是你!!


Q2:这些权限看到是看到了,我怎么和他们交个朋友了,熟悉了好办事啊?
A2:注意,首先你是一个会写代码的猿,看懂代码对你来说是事吗?其实我也是现学的,没做过安卓开发,既然都是小白,那还怕什么,有人是不是在静静的看着楼主装X。。。
  1 如何获取呢,请睁大你的双眼,这里是部分代码,稍后完整的工程会全部奉上!!!

final Bundle bundle = getArguments();
final String[] permissions = bundle.getStringArray(PERMISSIONS);
if (permissions != null)
{
Collections.addAll(requestedPermissions, permissions);
allPermissions = permissions;
}

轻轻松松拿到了我们想要的一切权限,是不是So Easy!

拿到了权限我们该怎么处理呢?目前需求是这样的,APK必须的权限都已授权,OK,结束!否则用户不想授予某个权限,例如读取你的联系人之类的,那就没办法了,应用关闭,结束!我感觉这么处理有点太直接了,说不定一个潜在的金主爸爸就这么流失了,我们是不是可以这样,既然拿到权限列表了,最笨的方法也是最有效的,我逐个检测是否授权不就得了,未授权,我给你弹个获取权限的框,说不定,用户一想,授权这也没什么啊,即使读取隐私,也是光明正大的了!那么读取联系人的权限就拿到了,下一个权限。。。权限列表请求一遍了,发现还有未授权的,那就真的GG了,此时不能再弹框申请权限了,用户会烦的,一位哪个傻逼写了个死循环呢!所以这是没办法了,要么此时来个温馨提示,由于您未授权读取联系人,部分功能无法启动,请打开权限后再次使用,谢谢!
我们接下来要做的就是拿到权限列表了,如何动态请求权限呢?

   public static void AskPermissions(final String gameObject, final int requestCode, final String[] permissions) {
UnityPlayer.currentActivity.runOnUiThread(new Runnable() {
@Override
public void run() {
final Bundle bundle = new Bundle();
bundle.putString(GAME_OBJECT, gameObject);
bundle.putInt(REQUEST_CODE, requestCode);
bundle.putStringArray(PERMISSIONS, permissions);
final PermissionProvider fragment = new PermissionProvider();
fragment.setArguments(bundle);
UnityPlayer.currentActivity
.getFragmentManager()
.beginTransaction()
.add(fragment, PermissionProvider.class.getCanonicalName())
.commit();
}
});
}   /**
     * Once user allow or deny permissions this method is called
     */
    @Override
    public void onRequestPermissionsResult(final int requestCode, final String[] permissions, final int[] grantResults) {
        LogExtensions.v(TAG, "[onRequestPermissionsResult] " + requestCode + " | " + Arrays.toString(permissions) + " | " + Arrays.toString(grantResults));         if (requestCode == this.requestCode) {
            boolean result = true;
            for (int i : grantResults) {
                if (i != PackageManager.PERMISSION_GRANTED) {
                    result = false;
                    break;
                }
            }
       //权限请求后的回调,告诉Unity我是否被授权了
            onComplete(gameObject, requestCode, result);
        }
        super.onRequestPermissionsResult(requestCode, permissions, grantResults);
    }

在Unity那边我只要记录一个权限列表的字典,被授权的在回掉中从自字典中删除该权限,到最后检测该字典的Count是否大于0即可,授权后且字典的Count大于0,第一轮的逐个权限请求还未结束,继续。直到权限全部授权结束!这是我们期望的结果,第二种结果是,其中一个用户未授权,那么gg了,弹框提示,退出应用,一首凉凉送给自己!

using UnityEngine;
using System.Collections;
using System;
using Platform.Android.Stubs; namespace Platform.Android
{
public class PermissionProvider : MonoBehaviour
{ public static event Action<bool> OnReceiveStoragePermission;
#if UNITY_ANDROID
private AndroidJavaClass _request;
public AndroidJavaClass Request {
get {
if (_request == null)
_request = new AndroidJavaClass ("com.example.androidpermissionmgr.PermissionProvider");
return _request;
}
}
#else public AndroidJavaClassStub Request = new AndroidJavaClassStub (); #endif public void VerifyStorage (Action<bool> action)
{
Debug.Log ("[PermissionProvider] VerifyStorage" );
OnReceiveStoragePermission += action;
RequestPermissions (1001, "android.permission.READ_EXTERNAL_STORAGE", "android.permission.ACCESS_NETWORK_STATE");//android.permission.ACCESS_NETWORK_STATE "android.permission.WRITE_EXTERNAL_STORAGE" } public void RequestPermissions (int requestCode, params string[]permissions)
{
Debug.Log ("[PermissionProvider] Requesting permissions: "+ requestCode + " " + permissions );
Request.CallStatic ("verifyPermissions", gameObject.name, requestCode, permissions);
} public void OnGranted (string requestCode)
{
Debug.Log("[PermissionProvider] OnGranted " + requestCode);
Example.result = "[PermissionProvider] OnGranted " + requestCode; if (requestCode.Equals("1001"))
{
if (OnReceiveStoragePermission != null)
OnReceiveStoragePermission(true);
}
if (Example.permissionDic.ContainsValue(int.Parse(requestCode)))
{
foreach (var item in Example.permissionDic)
{
if (item.Value == int.Parse(requestCode))
{
Example.permissionDic.Remove(item.Key);
break;
}
}
}
CheckPermissionAgain();
} public void OnDenied (string requestCode)
{
Debug.Log("[PermissionProvider] OnDenied " + requestCode);
Example.result += "[PermissionProvider] OnDenied " + requestCode;
if (requestCode.Equals("1001"))
{
if (OnReceiveStoragePermission != null)
OnReceiveStoragePermission(false);
}
//只要有一个重要权限未授权直接退出,或者再次请求权限
if (Example.permissionDic.Count>0)
{
Application.Quit();
}
} public void AskForPermission()
{
RequestPermissions(100, "android.permission.READ_CONTACTS");//android.permission.ACCESS_NETWORK_STATE "android.permission.WRITE_EXTERNAL_STORAGE" Example.result += "AskForPermission";
} public void GetNoGrantPermission()
{
Request.Call("GetNoGrantPermission");
} public void AskForAllPermission()
{
foreach (var item in Example.permissionDic)
{
RequestPermissions(item.Value, item.Key);
}
} public void CheckPermissionAgain()
{
if (Example.permissionDic.Count > 0)
{
AskForAllPermission();
}
else
{
Example.result = "APK已全部授权成功!";
}
}
}
}

由于写的比较粗糙,基本功能是实现了!大家有问题了可以@我,共同学习!!!
 不知不觉又凌晨了,明天要继续上班,碎觉了,做一只按时睡觉的猿!!!

截图

工程地址:https://gitee.com/wuzhang/UnityAndroidPermissionProject.git

欢迎Fork和Star!

Unity如何管理住Android 6.0 调皮的权限的更多相关文章

  1. Android权限管理之Android 6.0运行时权限及解决办法

    前言: 今天还是围绕着最近面试的一个热门话题Android 6.0权限适配来总结学习,其实Android 6.0权限适配我们公司是在今年5月份才开始做,算是比较晚的吧,不过现在Android 6.0以 ...

  2. android 6.0(23)的权限管理

    前言 谷歌在2015年8月份时候,发布了Android 6.0版本,代号叫做“棉花糖”(Marshmallow ),其中的很大的一部分变化,是在用户权限授权上,或许是感觉之前默认授权的不合理,现在6. ...

  3. Android 6.0 运行时权限处理完全解析

    一.概述 随着Android 6.0发布以及普及,我们开发者所要应对的主要就是新版本SDK带来的一些变化,首先关注的就是权限机制的变化.对于6.0的几个主要的变化,查看查看官网的这篇文章http:// ...

  4. Android 6.0 运行时权限处理完全解析 (摘抄)

    转载请标明出处: http://blog.csdn.net/lmj623565791/article/details/50709663: 本文出自:[张鸿洋的博客] 一.概述 随着Android 6. ...

  5. Android 6.0 执行时权限处理全然解析

    转载请标明出处: http://blog.csdn.net/lmj623565791/article/details/50709663: 本文出自:[张鸿洋的博客] 一.概述 随着Android 6. ...

  6. Android数据存储之Android 6.0运行时权限下文件存储的思考

    前言: 在我们做App开发的过程中基本上都会用到文件存储,所以文件存储对于我们来说是相当熟悉了,不过自从Android 6.0发布之后,基于运行时权限机制访问外置sdcard是需要动态申请权限,所以以 ...

  7. 谈谈Android 6.0运行时权限理解

    前言 谷歌在2015年8月份时候,发布了Android 6.0版本,代号叫做“棉花糖”(Marshmallow ),其中的很大的一部分变化,是在用户权限授权上,或许是感觉之前默认授权的不合理,现在6. ...

  8. Android 6.0 运行时权限处理

    在运行时请求权限 从Android 6.0(API级别23)开始,用户权限授予应用程序在应用程序运行时,当他们安装程序.这种方法简化了应用程序的安装过程,因为用户不需要安装或更新应用程序时授予权限.这 ...

  9. android-详解Android 6.0运行时权限

    感谢郭神,从Android 6.0开始,不再是安装应用时用户确定获得全部的权限.而是在使用软件过程中需要该权限时,弹出对话框让用户选择权限.不仅如此,用户选择权限后还可以关闭. 检查是否获得权限 通过 ...

随机推荐

  1. angular4升级angular5问题记录之No NgModule metadata found for 'AppModule'

    在将项目从angular4升级到angular5的过程中,出现No NgModule metadata found for 'AppModule'问题,网上查找答案将app.module.ts进行再次 ...

  2. Maven中模块的聚合以及对jar包的继承

    我需要将之前的A B C三个模块聚合到一个一个工程中ABC项目中 pom.xml文件中应该这样配置 1.修改packaging里面的配置 <!-- 用于聚合这个项目的时候应该将packaging ...

  3. Egret学习笔记 (Egret打飞机-4.添加主角飞机和实现飞行效果)

    今天继续写点击了开始之后,添加一个飞机到场景中,然后这个飞机的尾巴还在冒火的那种感觉 先拆解一下步骤 1.首先完成飞机容器的图片加载 2.然后把容器添加到场景中 3.然后实现动画 -首先,我们新建一个 ...

  4. 老男孩Python全栈开发(92天全)视频教程 自学笔记21

    day21课程内容:  json: #序列化 把对象(变量)从内存中 编程可存储和可传输的过程 称为序列化import jsondic={'name':'abc','age':18}with open ...

  5. CompletableFuture CompletableFuture.supplyAsync 异常处理

    CompletableFuture 异常处理completeExceptionally可以把异常抛到主线程 /** * User: laizhenwei * Date: 2018-01-30 Time ...

  6. effective C++笔记-2

    6:析构函数使用 1.如果一个基类是为了多态用途,那么就应该有一个虚析构函数. 2.如果一个类中有虚函数,那么就应该就有一个虚的析构函数. 3.如果一个基类中不是为了多态的用途,或者不作为基类来使用, ...

  7. 借助TZImagePickerController三方库理解自定义相册

    借助TZImagePickerController三方库理解自定义相册 1.整体架构分析 整体框架大致可以分为几个部分 <1>工具类-TZImageManager:这个类主要是工作是提供一 ...

  8. HighGUI图形图像界面初步—— 图像的载入、显示与输出

    HighGUI模块为高层GUI图形用户界面模块,包含媒体的输入输出.视频捕捉.图像和视频的编解码.图形交互界面的接口等. 在本章中,我们将学到: 图像的载入.显示和输出到文件的详细分析 滑动条的创建和 ...

  9. [JCIP笔记] (一)多线程的起源

    在很久很久以前,那时的计算机还没有操作系统这种东西,所以只能有一个程序,从头到尾地跑.于是这个程序要负责使用所有的资源,还得响应外部请求.想想这个程序得多复杂啊--为了做成一件事,可能要先把内存啊.I ...

  10. Android5.1系统WebView内存泄漏场景

    问题现象 (该文章,引自零号路的私人博客,本人在浏览框架的开发过程中,用该方式,规避了内存泄露的问题.) 在Android5.1系统中,会发现App存在 WebView 泄漏情况,还比较严重.并且只是 ...