zoukankan      html  css  js  c++  java
  • unity+android权限打开应用不弹权限,动态请求权限

    因为笔者之前的游戏需要分享图片,会请求外部储存,第一次打开游戏就会出现弹窗:

    很多人对这个很敏感,怕你访问到他们的照片隐私,看到这个权限就拒绝,甚至卸载,实际上我们只是想截屏游戏内容分享给其他玩家,但是赖不住人家不信啊.

    如果我们实在想要分享图片或者需要这个权限,那么我们可以不让它在启动的时候弹出,而是点击分享的时候弹出权限(动态请求权限)

    首先,屏蔽权限弹窗,AndroidManifest.xml里面加入

    <!-- Unity打包屏蔽android权限弹窗-->
    <meta-data android:name="unityplayer.SkipPermissionsDialog" android:value="true" />

    接下来是请求权限,在你需要的位置请求

    unity端

    //AndroidJavaClass是在UnityEngine命名空间里面的
    using UnityEngine;

    #if
    UNITY_ANDROID
    AndroidJavaClass androidClass
    = new AndroidJavaClass("com.xxx.xxx.UnityPlayerActivity");//获取class,填写正确的Activity
    androidClass.CallStatic("requestExternalStorage");//调用静态方法,requestExternalStorage这个函数名你可以自己取,记住是静态函数
    #endif

    java端,写在你的Activity里面

    import android.support.v4.content.PermissionChecker;
    import android.support.v4.app.ActivityCompat;
    //前面说过了静态方法,android.permission.WRITE_EXTERNAL_STORAGE是外部存储权限,同理其他权限也可以动态请求
    public static void requestExternalStorage() {
         //检查权限避免重复请求相同权限,参数:activity,权限名
            if (PermissionChecker.checkSelfPermission(this, "android.permission.WRITE_EXTERNAL_STORAGE") != 0) {
                ActivityCompat.requestPermissions(this, new String[]{"android.permission.WRITE_EXTERNAL_STORAGE"}, 100);//请求权限,参数:activity,权限名,请求码(不同的权限要求不同的请求码,可以自己定,比如我这个权限是100,另外的可以填102,103...)
            }
    }

    这样就可以避免打开应用出现权限弹窗了,在对应的位置动态请求权限

    但是,如果动态请求权限的时候,玩家拒绝了,咋办

    //如果玩家拒绝授权,需要再次申请并说明申请理由
    @Override
    public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {
       super.onRequestPermissionsResult(requestCode, permissions, grantResults);
      if(100 !=
    requestCode)return;//我们刚才定义的请求码是100
      //给个弹窗告知玩家这个权限不会对他造成影响  
      if (ActivityCompat.shouldShowRequestPermissionRationale("这个权限不会访问隐私,求求你开一下嘛", "android.permission.WRITE_EXTERNAL_STORAGE")) {
          (new Builder(this)).setMessage(string.storage_permissions_remind)
          .setPositiveButton("OK", new OnClickListener() {
       public void onClick(DialogInterface var1, int var2) {
              //点击ok,则再次请求
             requestExternalStorage();
       }
          }).setNegativeButton("Cancel", new OnClickListener() {
      public void onClick(DialogInterface var1, int var2) {
      //点击cancel,todo
      }
      }).create().show();
      super.onRequestPermissionsResult(requestCode, permissions, grantResults);
    }
    
    
  • 相关阅读:
    ArcGIS数据建模 (模型构建器modelbuilder) 培训视频 5章28小节587分钟视频 51GIS网站上线
    arcgis python ListEnvironments 函数可返回地理处理环境名称列表。
    arcgis python ValueTable使用
    解决ArcMap启动时只停留在初始化界面的方法
    Eutils用法总结
    EF 汇总函数使用注意事项Max()/Min()等
    C#多线程
    EF Attach时报错
    [Windows报错]要求的函数不受支持、这可能是由于 CredSSP 加密 Oracle 修正
    C#遍历XmlDocument对象所有节点名称、类型、属性(Attribute)
  • 原文地址:https://www.cnblogs.com/xianguoguo/p/11105819.html
Copyright © 2011-2022 走看看