Kha*_*los 5 android unity-game-engine lockscreen wakelock
我正在使用Unity构建一个Android应用程序,它正在顺利进行.但是,我有一个奇怪的问题,有关屏幕超时和锁屏没有显示.
应该发生什么
怎么了
笔记
我怀疑这是由于在屏幕超时时Unity不放弃的唤醒锁定引起的.这会导致应用程序保持焦点,锁屏永远不会"加载".这是一个非常严重的问题.
有谁知道有任何方法来解决这个问题?
注意:我已经在一周前的Unity Answers上问过这个问题,但还没有得到任何回复.我想也许我在这里有更好的运气.
首先,我要感谢MichaelTaylor3D 的回答为我指明了正确的方向。
他解决问题的方式存在一些问题,我认为我已经纠正了:
第一个问题是KeyguardManager
锁定屏幕的方法。这在 API 版本 8 中已被弃用,并且不适用于 API 9+。新的解决方案使用设备管理 API,这对于游戏来说似乎非常具有侵入性。
我查看了 eclipse 中的 UnityPlayer 定义,发现了一个名为 setWakeLock(boolean) 的函数,但它是私有的。
我做了一个自定义的android Activity。在其中,我访问受保护的 UnityPlayer 函数setWakeLock(boolean)
并在该函数中调用它onPause
。
我承认这不太理想,但它似乎确实有效且没有副作用。我已经向 Unity 提交了一份错误报告,因此希望这种解决方法不会需要很长时间。
public class UnityPlayerWithLockscreen extends UnityPlayerNativeActivity {
@Override
public void onCreate(Bundle savedInstanceState)
{
super.onCreate(savedInstanceState);
}
//Provides access to the private UnityPlayer.setWakeLock(boolean) method.
public void setWakeLock(boolean useWakelock) {
Method setWakeLockMethod;
//Use Reflection to get the setWakeLock(boolean) method from the UnityPlayer class
setWakeLockMethod = mUnityPlayer.getClass().getDeclaredMethod("setWakeLock");
//Set the method to me accessible
setWakeLockMethod.setAccessible(true);
//Invoke the method with our argument
setWakeLockMethod.invoke(mUnityPlayer, useWakelock);
}
@Override
protected void onPause()
{
super.onPause();
//Force unity to release the wakelock
setWakeLock(false);
}
}
Run Code Online (Sandbox Code Playgroud)
然后需要在AndroidManifest文件中将此Activity设置为主Activity:
<?xml version="1.0" encoding="utf-8"?>
<application android:icon="@drawable/icon" android:label="@string/app_name">
<activity android:name=".UnityPlayerWithLockscreen"
android:label="@string/app_name">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
</application>
Run Code Online (Sandbox Code Playgroud)
该解决方案也不需要任何 C# 脚本或 C# <-> Java 互操作。
再说一遍,我知道这有点像黑客解决方案,但它似乎可以在多种设备上运行,无论 API 级别如何,并且没有副作用。希望 Unity 能够尽快解决这个问题,并且不再需要丑陋的修复。