Unity5.x打包在Android8.x以上系统启动黑屏

原因

渠道要求app的targetSdkVersion要大于等于26
在这里插入图片描述
之前一直是targetversion 23的,而targetversion <= 23安装的时候需要的权限默认都是允许的,但是>23的,所需要的危险权限是默认拒绝的,存储权限就是危险权限一类(危险权限和正常权限就自行百度吧)。所以当游戏需要这个权限的时候,由于权限是没有的,而且没有进行权限申请,从而导致了游戏黑屏

解决方案A

在MainActivity的onCreate里面加了权限申请的代码,弹出了权限申请询问框了,点击允许,但是,依然黑屏,游戏强退之后查看权限管理,发现存储权限是有的,然后重新打开,游戏正常运行。
问题所在就是在权限申请之前,unity已经报错了:

unity:Unable to query for permission: Fragment null must be a public static class to be  properly recreated from instance state

也就是说,当unity需要这个权限的时候,权限还没有授予到。而android项目里面涉及到unity的代码就一个UnityPlayerActivity.onCreate,即调用UnityPlayerActivity.onCreate之前需要有权限授予,不然就会导致异常。
解决办法A:
写一个PermissionActivity (作为主Activity),专门做权限申请这件事情,等权限申请成功后,启动原来我们Unity的Activity
注意有两个activity的时候,要在manifest文件里面删除主activity的android:launchMode=“singleTask”,不然后台之后点击图标会重新启动app。
这个解决问题的方法的弊端是如果玩家点击了拒绝权限,依然会黑屏
附上权限申请的代码

// PermissionActivity.java
package com.linxinfa.test;

import java.util.ArrayList;
import java.util.List;

import android.app.Activity;
import android.app.AlertDialog;
import android.content.Context;
import android.content.DialogInterface;
import android.content.Intent;
import android.content.pm.PackageManager;
import android.os.Bundle;
import android.support.annotation.NonNull;
import android.support.v4.app.ActivityCompat;
import android.support.v4.content.ContextCompat;
import android.widget.Toast;

public class PermissionActivity extends Activity implements ActivityCompat.OnRequestPermissionsResultCallback
{

	private	final String[] PERMISSIONS = {
			"android.permission.READ_EXTERNAL_STORAGE",
			"android.permission.READ_EXTERNAL_STORAGE"
	};

	private Context m_context;
	
	@Override
	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		m_context = this;
		// 检测权限
		checkAppPermision();
	}
	
	private void checkAppPermision()
	{
		List<String> permissionList = new ArrayList<String>();
		for (int i = 0; i < PERMISSIONS.length; i++) 
		{
			if(PackageManager.PERMISSION_GRANTED != ContextCompat.checkSelfPermission(this, PERMISSIONS[i]))
			{
				permissionList.add(PERMISSIONS[i]);
			}
		}
		if(permissionList.size() > 0)
		{
			String[] permissionArray = new String[permissionList.size()];
			ActivityCompat.requestPermissions(this, permissionList.toArray(permissionArray), 1);
		}
		else 
		{
			StartGameActivity();
		}
	}
	
	public void onRequestPermissionResult(int requestCode, @NonNull String[] permissions,@NonNull int[] grantResults)
	{
		if(1 == requestCode)
		{
			if(grantResults.length > 0)
			{
				// 被拒绝的权限列表
				List<String> refusePermissionList = new ArrayList<String>();
				
				for(int i=0;i<grantResults.length;i++)
				{
					if(PackageManager.PERMISSION_GRANTED != grantResults[i])
					{
						refusePermissionList.add(permissions[i]);
					}
				}
				
				if(0 == refusePermissionList.size())
				{
					// 如果没有拒绝任何权限,则启动游戏Activity
					StartGameActivity();
				}
				else 
				{
					TipsNeedPermission(refusePermissionList);
				}
			}
		}
	}
	
	// 提示需要权限
	private void TipsNeedPermission(List<String> refusePermissionList)
	{
		AlertDialog dlg = new AlertDialog.Builder(this)
						.setTitle("提示")
						.setMessage("需要权限:" + refusePermissionList.toString())
						.setPositiveButton("知道了", new DialogInterface.OnClickListener() {
							
							@Override
							public void onClick(DialogInterface arg0, int arg1) {
								
								Toast.makeText(m_context, "要去应用管理设置应用权限", Toast.LENGTH_LONG).show();
							}
						})
						.create();
		dlg.show();
	}
	
	// 启动游戏Activity
	private void StartGameActivity()
	{
		Intent intent = new Intent(this, GameActivity.class);
		this.startActivity(intent);
		this.finish();
	}
}
// GameActivity.java
package com.linxinfa.test;

import android.os.Bundle;
import com.unity3d.player.UnityPlayer;
import com.unity3d.player.UnityPlayerActivity;

public class GameActivity extends UnityPlayerActivity
{
	@Override
	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
	}
}

解决方案B

升级到5.5.5p1可以解决这个问题
在这里插入图片描述
亲测可行,真是坑,直接升级补丁版本即可,不用像方案A那么麻烦

已标记关键词 清除标记
©️2020 CSDN 皮肤主题: Age of Ai 设计师:meimeiellie 返回首页