Primero me gustaría agradecer a Respuesta de Michaeltaylor3D por señalarme en la dirección correcta.
Hubo algunos problemas con la forma en que resolvió el problema que creo que he corregido:
El primer problema es con el KeyguardManager
enfoque para bloquear la pantalla. Esto se depreció en API versión 8 y no funcionará en API 9+. La nueva solución utiliza la API de administración del dispositivo que parece muy intrusiva para un juego.
Miré a través de la definición de UnityPlayer en Eclipse y encontré una función llamada setwakelock (boolean), sin embargo, es privado.
Hice una actividad de Android personalizada. En él, accedo a una función protegida de UnityPlayer setWakeLock(boolean)
y lo llama en el onPause
función.
Admito que esto es menos que ideal, pero parece funcionar sin efectos secundarios. He enviado un informe de errores a Unity, por lo que espero que este trabajo no sea necesario por mucho tiempo.
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);
}
}
Luego debe establecer esta actividad como la actividad principal en el archivo 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 solución tampoco requiere ningún scripts C# o C# <-> Java Intop.
Nuevamente, sé que esta es una especie de solución hacky, pero parece funcionar en varios dispositivos, independientemente del nivel de API sin efectos secundarios. Esperemos que esto sea arreglado por Unity pronto y ya no requerirá una solución fea.