找回密码
 立即注册
查看: 480|回复: 0

解决google Play unity obb包问题经历

[复制链接]
发表于 2021-1-8 17:56 | 显示全部楼层 |阅读模式
因为要上google play,google store上要求首包大小50M,所以我们分成APK+Obb包的形式。问题就这么产生了,打出来的包,在andriod 8.0的机器上,白屏。种种原因,这个问题交到我的手上。
       1、 问题是我之前没有接触过打包这块,OBB包是咋回事,也不甚了解,咋办呢,只能查吧,先了解下OBB包怎么做的https://www.cnblogs.com/vsirWaiter/p/6702534.html ,让同事帮忙确认了打出来的OBB包是OK的,在低版本下面是可以运行。
       2、找到打包工程开始调试,看logcat发现有报错
Failed to get permission info for android.permission.internet manifest likely missing custom permission ,拿这句话到百度里面去搜索,搜到一些,关于权限相关的设定,再搜
"unity 安卓8.0 权限",找到这两篇文章
解决unity打包在安卓8.0因为权限问题黑屏 - CSDN博客
关于unity打包的apk在安卓8.0上没有存储权限而导致黑屏的问题 - CSDN博客
这两篇指出
首先说一下这个问题出现的原因,targetversion<23的,安装的时候需要的权限默认都是允许的,但是>=23的,所需要的危险权限是默认拒绝的,存储权限就是危险权限一类(危险权限和正常权限就自行百度吧)。所以当游戏需要这个权限的时候,由于权限是没有的,而且没有进行权限申请,从而导致了游戏黑屏。
3、造成问题的原因找到了,下面就是怎么解决了,按文章里说的,严格上来说这是unity的版本的一个问题,我开始尝试搜索,诸如checkSelfPermission  requestPermissions 找到类似于(6.0及以上)运行时获取危险权限(Dangerous Permission) 这个的代码,从github上下了三个权限申请的范例源码。
4、先想到个简单的方案,23以后不行,直接改到22不就得了吗,可惜我们打完包给过去,运营很开心的测试了,在提交的时候发现了。现在上限平台要求必须支持26,就是8.0,就这样,偷懒没用。
    5、开始准备在MainActivity上添加申请权限的代码,发现行不通,我的MainActivity是继承于UnityActivity,要想能够获得onRequestPermissionsResult的回调,必须继承ActivityCompat.OnRequestPermissionsResultCallback 接口(通过百度onRequestPermissionsResult不回调,了解到),只能采取前面一个文章中提到新建一个Activity来代替MainActivity,申请完权限,再拉起原来的MainActivity的方法。研究了几份源码,精简了一下,
最后我的代码如下
  1. import java.util.ArrayList;
  2. import com.dragon.yymoon.R;
  3. import android.Manifest;
  4. import android.app.Activity;
  5. import android.content.Intent;
  6. import android.content.pm.PackageManager;
  7. import android.os.Build;
  8. import android.os.Bundle;
  9. import android.support.annotation.NonNull;
  10. import android.support.v4.app.ActivityCompat;
  11. import android.support.v4.app.FragmentTransaction;
  12. import android.support.v4.content.ContextCompat;
  13. import android.support.v7.app.AppCompatActivity;
  14. import android.util.Log;
  15. import android.widget.LinearLayout;
  16. public class MainActivity2 extends Activity implements ActivityCompat.OnRequestPermissionsResultCallback {
  17.     public static final String TAG = "Unity2";
  18.        
  19.         //权限数量
  20.         int         PermissionsCount = 0;       
  21.         int         MaxPermissionsCount = 6;       
  22.         ArrayList<String> list = new ArrayList<String>();
  23.        
  24.     @Override
  25.     protected void onCreate(Bundle savedInstanceState) {
  26.         super.onCreate(savedInstanceState);
  27.         setContentView(R.layout.activity_welcome);
  28.   
  29.         if (Build.VERSION.SDK_INT >= 23)
  30.         {           
  31.                 judgePermission();
  32.                 }
  33.         else
  34.         {
  35.                 PermissionsCount = MaxPermissionsCount;
  36.         }
  37.                         
  38.         if(PermissionsCount >= MaxPermissionsCount)
  39.         {
  40.                 StartMainActivity();
  41.         }
  42.     }
  43.    
  44.     private void judgePermission()
  45.     {
  46.             list.clear();
  47.             PermissionsCount += checkPermission(Manifest.permission.WRITE_EXTERNAL_STORAGE);
  48.              PermissionsCount += checkPermission(Manifest.permission.INTERNET);  
  49.             PermissionsCount += checkPermission(Manifest.permission.ACCESS_NETWORK_STATE);   
  50.             PermissionsCount += checkPermission(Manifest.permission.READ_PHONE_STATE);  
  51.               PermissionsCount += checkPermission(Manifest.permission.ACCESS_WIFI_STATE);
  52.              PermissionsCount += checkPermission(Manifest.permission.GET_ACCOUNTS);  
  53.             String[] strArrayTrue = (String[]) list.toArray(new String[0]);
  54.            
  55.             if(strArrayTrue.length > 0)
  56.             {
  57.                     ActivityCompat.requestPermissions(this,strArrayTrue,1);
  58.             }
  59.     }
  60.         @Override
  61.         public void onRequestPermissionsResult(int requestCode,
  62.                 String permissions[], int[] grantResults) {
  63.                 switch (requestCode)
  64.                 {
  65.                         case 1:                     
  66.                         {
  67.                                 for (int i = 0; i < grantResults.length; i++)
  68.                                 {
  69.                          if (grantResults[i] != PackageManager.PERMISSION_GRANTED)
  70.                          {
  71.                              //判断是否勾选禁止后不再询问
  72.                              boolean showRequestPermission = ActivityCompat.shouldShowRequestPermissionRationale(this, permissions[i]);
  73.                              if (showRequestPermission) {//
  74.                                  judgePermission();//重新申请权限
  75.                                  return;
  76.                              } else {
  77.                                      Log.e("--------->", "已经禁止");
  78.                                  //mShowRequestPermission = false;//已经禁止
  79.                              }
  80.                          }
  81.                          else
  82.                          {
  83.                                  Log.e("--------->", "申请权限成功");
  84.                                             PermissionsCount ++;       
  85.                          }
  86.                                 }                                
  87.                             break;
  88.                         }
  89.                 }
  90.                 
  91.                 if(PermissionsCount >= MaxPermissionsCount)
  92.                 {
  93.                         StartMainActivity();
  94.                 }                
  95.         }
  96.        
  97.         //检查某项权限
  98.         private int checkPermission(String strPermission)
  99.         {
  100.                 if(ContextCompat.checkSelfPermission(this,strPermission)
  101.                        != PackageManager.PERMISSION_GRANTED){
  102.                          Log.e("--------->", "没有权限");
  103.                         list.add(strPermission);
  104.                         return 0;
  105.                 }
  106.                
  107.                 return 1;
  108.         }
  109.        
  110.     private void StartMainActivity()
  111.     {           
  112.         Intent intent =new Intent(this,MainActivity.class);
  113.         this.startActivity(intent);
  114.         MainActivity2.this.finish();
  115.     }
  116. }
复制代码
把这个代码写好的的过程中,遇到以下几个坑
1、android-support-v4.jar  中没有权限申请的接口,发现需要v7版本的jar,在找v7版本的jar的过程中又发现v4其实有一个带这些方法的jar的,又更新了一下v4.jar.由于好多年用过eclips,连导入jar也不太会了,中间又折腾了好久,终于导入成功了,但是怎么运行都不对。都快绝望了,清理了一下工程,神奇的代码可以工作了。
2、开始特别坑,打一次包装一次手机测试,耽误了好久,后来liy提醒我,可以直接调试啊,好吧,为啥不早说。
3、开始不知道究竟是需要哪些权限,人都跑了,留我一人在那边试,通过调试,看log结合别人的权限,发现需要这三个
懒得打字嘛,点击右侧快捷回复 【右侧内容,后台自定义】
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Unity开发者联盟 ( 粤ICP备20003399号 )

GMT+8, 2024-11-16 00:46 , Processed in 0.094092 second(s), 25 queries .

Powered by Discuz! X3.5 Licensed

© 2001-2024 Discuz! Team.

快速回复 返回顶部 返回列表