墙和鸡蛋 发表于 2021-1-8 17:56

解决google Play unity obb包问题经历

因为要上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的版本的一个问题,我开始尝试搜索,诸如checkSelfPermissionrequestPermissions 找到类似于(6.0及以上)运行时获取危险权限(Dangerous Permission) 这个的代码,从github上下了三个权限申请的范例源码。
4、先想到个简单的方案,23以后不行,直接改到22不就得了吗,可惜我们打完包给过去,运营很开心的测试了,在提交的时候发现了。现在上限平台要求必须支持26,就是8.0,就这样,偷懒没用。
    5、开始准备在MainActivity上添加申请权限的代码,发现行不通,我的MainActivity是继承于UnityActivity,要想能够获得onRequestPermissionsResult的回调,必须继承ActivityCompat.OnRequestPermissionsResultCallback 接口(通过百度onRequestPermissionsResult不回调,了解到),只能采取前面一个文章中提到新建一个Activity来代替MainActivity,申请完权限,再拉起原来的MainActivity的方法。研究了几份源码,精简了一下,
最后我的代码如下
import java.util.ArrayList;

import com.dragon.yymoon.R;

import android.Manifest;
import android.app.Activity;
import android.content.Intent;
import android.content.pm.PackageManager;
import android.os.Build;
import android.os.Bundle;
import android.support.annotation.NonNull;
import android.support.v4.app.ActivityCompat;
import android.support.v4.app.FragmentTransaction;
import android.support.v4.content.ContextCompat;
import android.support.v7.app.AppCompatActivity;
import android.util.Log;
import android.widget.LinearLayout;

public class MainActivity2 extends Activity implements ActivityCompat.OnRequestPermissionsResultCallback {

    public static final String TAG = "Unity2";
       
        //权限数量
        int         PermissionsCount = 0;       
        int         MaxPermissionsCount = 6;       
        ArrayList<String> list = new ArrayList<String>();
       
    @Override
    protected void onCreate(Bundle savedInstanceState) {
      super.onCreate(savedInstanceState);
      setContentView(R.layout.activity_welcome);

      if (Build.VERSION.SDK_INT >= 23)
      {           
              judgePermission();
                }
      else
      {
              PermissionsCount = MaxPermissionsCount;
      }
                        
      if(PermissionsCount >= MaxPermissionsCount)
      {
              StartMainActivity();
      }
    }
   
    private void judgePermission()
    {
            list.clear();
            PermissionsCount += checkPermission(Manifest.permission.WRITE_EXTERNAL_STORAGE);
           PermissionsCount += checkPermission(Manifest.permission.INTERNET);
            PermissionsCount += checkPermission(Manifest.permission.ACCESS_NETWORK_STATE);   
            PermissionsCount += checkPermission(Manifest.permission.READ_PHONE_STATE);
              PermissionsCount += checkPermission(Manifest.permission.ACCESS_WIFI_STATE);
           PermissionsCount += checkPermission(Manifest.permission.GET_ACCOUNTS);

            String[] strArrayTrue = (String[]) list.toArray(new String);
           
            if(strArrayTrue.length > 0)
            {
                    ActivityCompat.requestPermissions(this,strArrayTrue,1);
            }
    }

        @Override
        public void onRequestPermissionsResult(int requestCode,
                String permissions[], int[] grantResults) {
                switch (requestCode)
                {
                        case 1:                     
                        {
                                for (int i = 0; i < grantResults.length; i++)
                                {
                         if (grantResults != PackageManager.PERMISSION_GRANTED)
                         {
                             //判断是否勾选禁止后不再询问
                             boolean showRequestPermission = ActivityCompat.shouldShowRequestPermissionRationale(this, permissions);
                             if (showRequestPermission) {//
                               judgePermission();//重新申请权限
                               return;
                             } else {
                                   Log.e("--------->", "已经禁止");
                               //mShowRequestPermission = false;//已经禁止
                             }
                         }
                         else
                         {
                             Log.e("--------->", "申请权限成功");
                                            PermissionsCount ++;       
                         }
                                }                              
                            break;
                        }
                }
                
                if(PermissionsCount >= MaxPermissionsCount)
                {
                        StartMainActivity();
                }                
        }
       
        //检查某项权限
        private int checkPermission(String strPermission)
        {
                if(ContextCompat.checkSelfPermission(this,strPermission)
                       != PackageManager.PERMISSION_GRANTED){
                       Log.e("--------->", "没有权限");
                        list.add(strPermission);
                        return 0;
                }
               
                return 1;
        }
       

    private void StartMainActivity()
    {           
      Intent intent =new Intent(this,MainActivity.class);
      this.startActivity(intent);
      MainActivity2.this.finish();
    }
}把这个代码写好的的过程中,遇到以下几个坑
1、android-support-v4.jar中没有权限申请的接口,发现需要v7版本的jar,在找v7版本的jar的过程中又发现v4其实有一个带这些方法的jar的,又更新了一下v4.jar.由于好多年用过eclips,连导入jar也不太会了,中间又折腾了好久,终于导入成功了,但是怎么运行都不对。都快绝望了,清理了一下工程,神奇的代码可以工作了。
2、开始特别坑,打一次包装一次手机测试,耽误了好久,后来liy提醒我,可以直接调试啊,好吧,为啥不早说。
3、开始不知道究竟是需要哪些权限,人都跑了,留我一人在那边试,通过调试,看log结合别人的权限,发现需要这三个
页: [1]
查看完整版本: 解决google Play unity obb包问题经历