Primeiro eu gostaria de agradecer a Resposta de Michaeltaylor3d por me apontar na direção certa.
Houve alguns problemas com a maneira como ele resolveu o problema que acho que corrigi:
A primeira edição é com o KeyguardManager
abordagem para travar a tela. Isso foi depreciado na API versão 8 e não funcionará na API 9+. A nova solução usa a API de administrador do dispositivo, que parece muito intrusiva para um jogo.
Eu olhei através da definição do UnityPlayer no Eclipse e encontrei uma função chamada Setwakelock (booleana), no entanto, ela é privada.
Eu fiz uma atividade Android personalizada. Nele, eu acesso uma função de unityplayer protegida setWakeLock(boolean)
e chama isso no onPause
função.
Admito que isso é menos do que o ideal, mas parece funcionar sem efeitos colaterais. Eu enviei um relatório de bug à Unity, por isso espero que este trabalho não seja necessário por muito tempo.
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);
}
}
Então você precisa definir essa atividade como a principal atividade no arquivo AndroidManifest:
<?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>
Esta solução também não requer scripts C# ou c# <-> Java Interop.
Novamente, eu sei que isso é uma espécie de solução hacky, mas parece funcionar em vários dispositivos, independentemente do nível da API sem efeitos colaterais. Espero que isso seja corrigido pela Unidade em breve e não exigirá mais uma correção feia.