原因
渠道要求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那么麻烦