|
因为要上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的方法。研究了几份源码,精简了一下,
最后我的代码如下- 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 = &#34;Unity2&#34;;
-
- //权限数量
- 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[0]);
-
- 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[i] != PackageManager.PERMISSION_GRANTED)
- {
- //判断是否勾选禁止后不再询问
- boolean showRequestPermission = ActivityCompat.shouldShowRequestPermissionRationale(this, permissions[i]);
- if (showRequestPermission) {//
- judgePermission();//重新申请权限
- return;
- } else {
- Log.e(&#34;--------->&#34;, &#34;已经禁止&#34;);
- //mShowRequestPermission = false;//已经禁止
- }
- }
- else
- {
- Log.e(&#34;--------->&#34;, &#34;申请权限成功&#34;);
- PermissionsCount ++;
- }
- }
- break;
- }
- }
-
- if(PermissionsCount >= MaxPermissionsCount)
- {
- StartMainActivity();
- }
- }
-
- //检查某项权限
- private int checkPermission(String strPermission)
- {
- if(ContextCompat.checkSelfPermission(this,strPermission)
- != PackageManager.PERMISSION_GRANTED){
- Log.e(&#34;--------->&#34;, &#34;没有权限&#34;);
- 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结合别人的权限,发现需要这三个 |
|