Unity5.x打包在Android8.x以上系统启动黑屏
发布日期:2021-06-30 19:41:37 浏览次数:3 分类:技术文章

本文共 3596 字,大约阅读时间需要 11 分钟。

原因

渠道要求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.javapackage 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
permissionList = new ArrayList
(); 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
refusePermissionList = new ArrayList
(); for(int i=0;i
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.javapackage 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那么麻烦

转载地址:https://linxinfa.blog.csdn.net/article/details/89890520 如侵犯您的版权,请留言回复原文章的地址,我们会给您删除此文章,给您带来不便请您谅解!

上一篇:app运行提示Unable to Initialize Unity Engine
下一篇:Unity升级Android SDK遇到的问题

发表评论

最新留言

网站不错 人气很旺了 加油
[***.192.178.218]2024年04月23日 08时07分04秒