2013-08-07 10 views
12

L'utente si aspetta che la mia app spenga lo schermo dopo essere stata utilizzata. Al momento, ottengo ciò con i diritti di Device Administrator e DevicePolicyManager.lockNow(), che funziona bene se le impostazioni di sicurezza sono impostate su PIN/Pattern/FaceUnlock, ecc.DevicePolicyManager.lockNow(); non disattiva lo schermo quando le impostazioni di sicurezza sono impostate su Diapositiva/Nessuno

Tuttavia, se si utilizza Diapositiva/Nessuno, il comando sopra riportato riprende semplicemente utente alla homescreen (o non fa nulla), il che è comprensibile, dal momento che non c'è nulla da "bloccare". C'è un modo per ottenere lo spegnimento dello schermo in una situazione del genere? La mia app richiede SDK> = 16, se questo è importante.

Quindi credo che la mia domanda è: Come può un app commutare in modo affidabile fuori dallo schermo (non sto in possesso di un wakelock, sto usando il WindowManager -flags FLAG_TURN_SCREEN_ON in onAttachedToWindow()).

Il "flusso" della mia app è:
- L'attività è iniziata da un intento, mentre lo schermo è spento, mostra sopra il blocco della tastiera/interruttori sullo schermo con le bandiere suddette
- utente chiude attivamente mia Attività, chiamo lockNow() e finish() e l'utente si aspetta che lo schermo si spenga. Se l'utente sta utilizzando il blocco nessuno/diapositiva, questo non funziona e viene visualizzata la schermata iniziale dell'utente

Grazie!

+0

Se si sviluppa un'applicazione di sistema (ad esempio, firmato con la chiave della piattaforma), è possibile utilizzare il [ 'metodo goToSleep' della classe' PowerManager'] (http://developer.android.com/reference/android /os/PowerManager.html#goToSleep%28long%29) ... – dst

+0

Grazie, dst! Sfortunatamente, è un'app "normale": -/ – Nick

+0

Se si richiede 'WRITE_SETTINGS', è possibile impostare il timeout dello schermo su 1 secondo -' android.provider.Settings.System.putInt (getContentResolver(), Settings.System. SCREEN_OFF_TIMEOUT, 1000); ' Ovviamente, si stanno rovinando le impostazioni dell'utente, ma non riesco a trovare un modo migliore per farlo. Io ** ho ** visto app che lo fanno - NoLED è l'esempio più importante. – Delyan

risposta

0

ho usato il commento di Delyan per raggiungere questo obiettivo:

Se si richiede WRITE_SETTINGS, probabilmente si può impostare il timeout dello schermo per essere 1 sec - android.provider.Settings.System.putInt (getContentResolver(), Settings.System.SCREEN_OFF_TIMEOUT, 1000); Naturalmente, allora si sta rovinare le impostazioni dell'utente ma non riesco a trovare un modo migliore per farlo. Ho visto le applicazioni che lo fanno - NoLED è l'esempio più evidente.

5

Per cominciare vedere here:

Per controllare questa politica, l'amministratore dispositivo deve avere un tag "forza-lock" nella sezione "usa-politiche" dei suoi meta-dati.

L'amministratore del dispositivo chiamante deve aver richiesto USES_POLICY_FORCE_LOCK a essere in grado di chiamare questo metodo; in caso contrario, verrà generata un'eccezione di sicurezza .

seconda dal codice che hai, here's una bella bella spiegazione di ciò che può essere sbagliato nel tuo caso (naturalmente qualsiasi codice fornito qui sarà utile!).

ho sentito in diverse occasioni, che chiama due volte il codice DevicePolicyManager.lockNow() farà il trucco e here's un modo di fare che:

mDPM = (DevicePolicyManager)getApplicationContext().getSystemService("device_policy"); 
Handler handlerUI = new Handler(); 
     handlerUI.postDelayed(new Runnable() { 
      @Override 
      public void run() { 
       mDPM.lockNow(); 
      } 
     }, 200); 
     finish(); 
     mDPM.lockNow(); 

Here ho trovato una versione più elaborata della stessa cosa:

Android DevicePolicyManager lockNow() problem 
public class SMSMessagingActivity extends Activity { 
    /** Called when the activity is first created. */ 

public static DevicePolicyManager mDPM; 

    @Override 
    public void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.main); 

     mDPM = (DevicePolicyManager)getSystemService(Context.DEVICE_POLICY_SERVICE);      

    } 

    public static void LockNow(){ 
     mDPM.lockNow(); 
    } 

} 

ComponentName devAdminReceiver; // this would have been declared in your class body 
// then in your onCreate 
    mDPM = (DevicePolicyManager)getSystemService(Context.DEVICE_POLICY_SERVICE); 
    devAdminReceiver = new ComponentName(context, deviceAdminReceiver.class); 
//then in your onResume 

boolean admin = mDPM.isAdminActive(devAdminReceiver); 
if (admin) 
    mDPM.lockNow(); 
else Log.i(tag,"Not an admin"); 

Speriamo che l'ultima soluzione funzioni correttamente.

Acclamazioni

+0

Grazie per la risposta. Il problema è che il metodo 'lockNow()' non funziona (indipendentemente dal fatto che venga chiamato una o due volte) se l'utente ha impostato l'impostazione lockscreen su "None" o "Slide". – Nick

+0

Sì, penso che non funzioni oltre la 4.0. Per favore, provalo con una versione precedente, su Emulator o qualcosa (o meglio su un dispositivo) in modo che possiamo provare questo problema? Grazie – g00dy

+0

Ah, ok, grazie per avermelo fatto sapere. La mia app richiede SDK Level> = 4.0, quindi questo purtroppo non aiuta nel mio caso, ma proverò su un dispositivo più vecchio solo per vedere se questo è il problema :) – Nick

Problemi correlati