屏幕超时时未显示Unity3D Android锁屏.(激活锁定?)

Kha*_*los 5 android unity-game-engine lockscreen wakelock

我正在使用Unity构建一个Android应用程序,它正在顺利进行.但是,我有一个奇怪的问题,有关屏幕超时和锁屏没有显示.

应该发生什么

  • 用户停止播放
  • 屏幕超时并关闭
  • 之后,玩家返回并重新打开手机
  • 锁屏显示,用户可以输入密码或以其他方式解锁手机
  • 应用程序重新获得关注并继续

怎么了

  • 用户停止播放
  • 屏幕超时并关闭
  • 之后,玩家返回并重新打开手机
  • 锁屏确实显示!该应用程序正确聚焦,一起绕过锁屏
  • 用户生气,他们的安全性受到损害:(

笔记

  • 无论我是否使用Android插件,都会发生这种情况
  • 我正在使用Unity 4.2.0f4(尽管更新版本的更改日志对此问题没有任何意义)
  • 它甚至发生在一个空白的Android项目上
  • 我在5种不同的设备上测试了这个,都有同样的问题

我怀疑这是由于在屏幕超时时Unity不放弃的唤醒锁定引起的.这会导致应用程序保持焦点,锁屏永远不会"加载".这是一个非常严重的问题.

有谁知道有任何方法来解决这个问题?

注意:我已经在一周前的Unity Answers上问过这个问题,但还没有得到任何回复.我想也许我在这里有更好的运气.

Kha*_*los 2

首先,我要感谢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 能够尽快解决这个问题,并且不再需要丑陋的修复。