Unity Googleplay Android版升級到31幻林,Unity閃屏之后卡死

當(dāng)前海外版本有硬性要求:Target API level必須升級到31贞盯,升級之后在Android 12機型上啟動游戲,Unity閃屏之后卡死沪饺,其他Android版本正常躏敢。

查了一下這個問題,是因為TelephonyManager的listen函數(shù)在Android 12過期了整葡,如果沒有授權(quán)READ_PHONE_STATE權(quán)限件余,此函數(shù)會拋出一個SecurityException。
而Unity在啟用了自帶的音頻系統(tǒng)的情況下遭居,恰巧在啟動時機會去調(diào)用這個方法以實現(xiàn)“在用戶接電話時游戲靜音”的功能啼器,拋出的異常影響了后續(xù)的流程導(dǎo)致卡死。

論壇上有人遇到了類似的問題俱萍,但是表現(xiàn)為崩潰:
https://forum.unity.com/threads/android-12-telephony-crash.1287986/
項目能升級引擎的話端壳,可以試試這里提到的修復(fù)的版本:
https://issuetracker.unity3d.com/issues/android-player-crashing-in-fmod-when-targetting-sdk-level-31

如果項目不能升級引擎,也有一個解決辦法:
重新寫一個android的啟動類枪蘑, 將這個問題繞過去

package com.xx.xxx
import android.content.Context;
import android.os.Build;
import com.unity3d.player.UnityPlayer;

public class UnityPlayerNew  extends UnityPlayer
{
    public UnityPlayerNew(Context context) 
    {
        super(context);
    }

    @Override
    protected void addPhoneCallListener()
    {
        if (Build.VERSION.SDK_INT >= 31)
        {
            return;
        }
        super.addPhoneCallListener();
    }
}
package com.xx.xxx;

import com.unity3d.player.*;
import android.app.Activity;
import android.content.Intent;
import android.content.res.Configuration;
import android.graphics.PixelFormat;
import android.os.Bundle;
import android.view.KeyEvent;
import android.view.MotionEvent;
import android.view.View;
import android.view.Window;
import android.view.WindowManager;

public class UnityPlayerActivity extends Activity
{
    protected UnityPlayer mUnityPlayer; // don't change the name of this variable; referenced from native code

    protected String updateUnityCommandLineArguments(String cmdLine)
    {
        return cmdLine;
    }

    // Setup activity layout
    @Override protected void onCreate(Bundle savedInstanceState)
    {
        requestWindowFeature(Window.FEATURE_NO_TITLE);
        super.onCreate(savedInstanceState);

        String cmdLine = updateUnityCommandLineArguments(getIntent().getStringExtra("unity"));
        getIntent().putExtra("unity", cmdLine);

        mUnityPlayer = new UnityPlayerNew(this);

        setContentView(mUnityPlayer);
        mUnityPlayer.requestFocus();
    }

    @Override protected void onNewIntent(Intent intent)
    {
        // To support deep linking, we need to make sure that the client can get access to
        // the last sent intent. The clients access this through a JNI api that allows them
        // to get the intent set on launch. To update that after launch we have to manually
        // replace the intent with the one caught here.
        setIntent(intent);
    }

    // Quit Unity
    @Override protected void onDestroy ()
    {
        mUnityPlayer.destroy();
        super.onDestroy();
    }

    // Pause Unity
    @Override protected void onPause()
    {
        super.onPause();
        mUnityPlayer.pause();
    }

    // Resume Unity
    @Override protected void onResume()
    {
        super.onResume();
        mUnityPlayer.resume();
    }

    @Override protected void onStart()
    {
        super.onStart();
        mUnityPlayer.start();
    }

    @Override protected void onStop()
    {
        super.onStop();
        mUnityPlayer.stop();
    }

    // Low Memory Unity
    @Override public void onLowMemory()
    {
        super.onLowMemory();
        mUnityPlayer.lowMemory();
    }

    // Trim Memory Unity
    @Override public void onTrimMemory(int level)
    {
        super.onTrimMemory(level);
        if (level == TRIM_MEMORY_RUNNING_CRITICAL)
        {
            mUnityPlayer.lowMemory();
        }
    }

    // This ensures the layout will be correct.
    @Override public void onConfigurationChanged(Configuration newConfig)
    {
        super.onConfigurationChanged(newConfig);
        mUnityPlayer.configurationChanged(newConfig);
    }

    // Notify Unity of the focus change.
    @Override public void onWindowFocusChanged(boolean hasFocus)
    {
        super.onWindowFocusChanged(hasFocus);
        mUnityPlayer.windowFocusChanged(hasFocus);
    }

    // For some reason the multiple keyevent type is not supported by the ndk.
// Force event injection by overriding dispatchKeyEvent().
@Override public boolean dispatchKeyEvent(KeyEvent event)
{
if (event.getAction() == KeyEvent.ACTION_MULTIPLE)
return mUnityPlayer.injectEvent(event);
return super.dispatchKeyEvent(event);
}

// Pass any events not handled by (unfocused) views straight to UnityPlayer
@Override public boolean onKeyUp(int keyCode, KeyEvent event)     { return mUnityPlayer.injectEvent(event); }
@Override public boolean onKeyDown(int keyCode, KeyEvent event)   { return mUnityPlayer.injectEvent(event); }
@Override public boolean onTouchEvent(MotionEvent event)          { return mUnityPlayer.injectEvent(event); }
/*API12*/ public boolean onGenericMotionEvent(MotionEvent event)  { return mUnityPlayer.injectEvent(event); }
}
<activity android:name="com.xx.xxx.UnityPlayerActivity" android:screenOrientation="landscape" android:exported="true" android:configChanges="fontScale|keyboard|keyboardHidden|locale|mnc|mcc|navigation|orientation|screenLayout|screenSize|smallestScreenSize|uiMode|touchscreen">
  <intent-filter>
    <action android:name="android.intent.action.MAIN" />
    <category android:name="android.intent.category.LAUNCHER" />
    <category android:name="android.intent.category.LEANBACK_LAUNCHER" />
  </intent-filter>
</activity>
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末更哄,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子腥寇,更是在濱河造成了極大的恐慌,老刑警劉巖觅捆,帶你破解...
    沈念sama閱讀 219,490評論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件赦役,死亡現(xiàn)場離奇詭異,居然都是意外死亡栅炒,警方通過查閱死者的電腦和手機掂摔,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,581評論 3 395
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人锅移,你說我怎么就攤上這事互婿。” “怎么了叭披?”我有些...
    開封第一講書人閱讀 165,830評論 0 356
  • 文/不壞的土叔 我叫張陵寥殖,是天一觀的道長。 經(jīng)常有香客問我涩蜘,道長嚼贡,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,957評論 1 295
  • 正文 為了忘掉前任同诫,我火速辦了婚禮粤策,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘误窖。我一直安慰自己叮盘,他們只是感情好,可當(dāng)我...
    茶點故事閱讀 67,974評論 6 393
  • 文/花漫 我一把揭開白布霹俺。 她就那樣靜靜地躺著柔吼,像睡著了一般。 火紅的嫁衣襯著肌膚如雪吭服。 梳的紋絲不亂的頭發(fā)上嚷堡,一...
    開封第一講書人閱讀 51,754評論 1 307
  • 那天,我揣著相機與錄音艇棕,去河邊找鬼蝌戒。 笑死,一個胖子當(dāng)著我的面吹牛沼琉,可吹牛的內(nèi)容都是我干的北苟。 我是一名探鬼主播,決...
    沈念sama閱讀 40,464評論 3 420
  • 文/蒼蘭香墨 我猛地睜開眼打瘪,長吁一口氣:“原來是場噩夢啊……” “哼友鼻!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起闺骚,我...
    開封第一講書人閱讀 39,357評論 0 276
  • 序言:老撾萬榮一對情侶失蹤彩扔,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后僻爽,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體虫碉,經(jīng)...
    沈念sama閱讀 45,847評論 1 317
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,995評論 3 338
  • 正文 我和宋清朗相戀三年胸梆,在試婚紗的時候發(fā)現(xiàn)自己被綠了敦捧。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片须板。...
    茶點故事閱讀 40,137評論 1 351
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖兢卵,靈堂內(nèi)的尸體忽然破棺而出习瑰,到底是詐尸還是另有隱情,我是刑警寧澤秽荤,帶...
    沈念sama閱讀 35,819評論 5 346
  • 正文 年R本政府宣布甜奄,位于F島的核電站,受9級特大地震影響王滤,放射性物質(zhì)發(fā)生泄漏贺嫂。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 41,482評論 3 331
  • 文/蒙蒙 一雁乡、第九天 我趴在偏房一處隱蔽的房頂上張望第喳。 院中可真熱鬧,春花似錦踱稍、人聲如沸曲饱。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,023評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽扩淀。三九已至,卻和暖如春啤挎,著一層夾襖步出監(jiān)牢的瞬間驻谆,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,149評論 1 272
  • 我被黑心中介騙來泰國打工庆聘, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留胜臊,地道東北人。 一個月前我還...
    沈念sama閱讀 48,409評論 3 373
  • 正文 我出身青樓伙判,卻偏偏與公主長得像象对,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子宴抚,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 45,086評論 2 355

推薦閱讀更多精彩內(nèi)容