Per prima cosa vorrei dire grazie a La risposta di MichaelTaylor3D per avermi indicato la giusta direzione.
Ci sono stati alcuni problemi nel modo in cui ha risolto il problema che penso di aver corretto:
Il primo problema riguarda il KeyguardManager
approccio per bloccare lo schermo.Questo è stato deprezzato nella versione API 8 e non funzionerà sull'API 9+.La nuova soluzione utilizza l'API Device Admin che sembra molto invadente per un gioco.
Ho esaminato la definizione di UnityPlayer in Eclipse e ho trovato una funzione chiamata setWakeLock(boolean), tuttavia è privata.
Ho creato un'attività Android personalizzata.In esso accedo a una funzione protetta di UnityPlayer setWakeLock(boolean)
e lo chiama nel onPause
funzione.
Ammetto che questo non è proprio l'ideale, ma sembra funzionare senza effetti collaterali.Ho inviato una segnalazione di bug a Unity, quindi spero che questa soluzione non sia necessaria a lungo.
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);
}
}
Quindi devi impostare questa attività come attività principale nel file 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>
Inoltre, questa soluzione non richiede script C# o interoperabilità C# <-> Java.
Ancora una volta, so che si tratta di una soluzione un po' complicata, ma sembra funzionare su diversi dispositivi indipendentemente dal livello API senza effetti collaterali.Si spera che questo venga risolto presto da Unity e non richieda più una brutta soluzione.