Je voudrais d'abord dire merci à Réponse de Michaeltaylor3d pour me pointer dans la bonne direction.
Il y a eu quelques problèmes avec la façon dont il a résolu le problème que je pense que j'ai corrigé:
Le premier problème est avec le KeyguardManager
approche pour verrouiller l'écran. Cela a été déprécié dans l'API version 8 et ne fonctionnera pas sur l'API 9+. La nouvelle solution utilise l'API Admin de périphérique qui semble très intrusive pour un jeu.
J'ai examiné la définition d'UnityPlayer dans Eclipse et j'ai trouvé une fonction appelée setwakelock (boolean), mais elle est privée.
J'ai fait une activité Android personnalisée. Dans ce document, j'accédez à une fonction UnityPlayer protégée setWakeLock(boolean)
et l'appelle dans le onPause
fonction.
J'avoue que c'est loin d'être idéal, mais cela semble fonctionner sans effets secondaires. J'ai soumis un rapport de bogue à Unity, alors j'espère que ce travail ne sera pas requis depuis longtemps.
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);
}
}
Ensuite, vous devez définir cette activité en tant qu'activité principale dans le fichier 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>
Cette solution ne nécessite pas non plus de scripts C # ou de C # <-> Java Interop.
Encore une fois, je sais que c'est une sorte de solution de pirate, mais cela semble fonctionner sur plusieurs appareils, quel que soit le niveau d'API sans effets secondaires. Espérons que cela sera bientôt corrigé par Unity et ne nécessitera plus de solution laide.