2011-06-13 17 views
5

Ho abilitato il proximity wakelock nella mia app, e si spegne lo schermo quando il sensore di prossimità rileva qualcosa. Ma c'è un problema quando lo schermo si riattiva: va nella schermata di blocco, non nella mia app. Ciò accade indipendentemente dal tempo in cui lo schermo era spento (anche se il sensore viene cancellato dopo alcuni secondi). Ecco il codice che ho usato:Aiuto con PROXIMITY_SCREEN_OFF_WAKE_LOCK in Android

int PROXIMITY_SCREEN_OFF_WAKE_LOCK = 32;  
mProximityWakeLock = pm.newWakeLock(PROXIMITY_SCREEN_OFF_WAKE_LOCK, LOG_TAG); 
if(!mProximityWakeLock.isHeld()){ 
    mProximityWakeLock.acquire(); 
} 

Esiste un modo per correggere tale comportamento?

risposta

2

Se stai usando mProximityWakeLock.release();, provare a utilizzare mProximityWakeLock.release(1);

Il riferimento API è anche nascosto, ma si può guardare il codice sorgente: http://grepcode.com/file/repository.grepcode.com/java/ext/com.google.android/android/2.1_r2/android/os/PowerManager.java#PowerManager.WakeLock.release%28int%29

+0

Grazie, sto già utilizzando mProximityWakeLock.release (1). Ho usato il riflesso per farlo funzionare, e funziona sicuramente - lo schermo si spegne quando copro il sensore di prossimità e si riaccende quando lo cancello. Va solo nella schermata di blocco, che ovviamente non è quello che voglio. – user496854

+0

@ user496854 Puoi spiegare come utilizzare la riflessione per utilizzare mProximityWakeLock.release (1) ??.Grazie in anticipo – jegumi

+0

Non c'è un modo semplice per pubblicarlo come commento, ma andare avanti e iniziare la propria domanda su come farlo, e posso postare il codice lì come risposta – user496854

4

È possibile chiudere la schermata di blocco, se non lo è uno sicuro, utilizzando:

getWindow().addFlags(WindowManager.LayoutParams.FLAG_DISMISS_KEYGUARD); 

si può o chiamare sulla creazione per evitare che la schermata di blocco da mai apparire o quando è necessario. Lo uso in combinazione con:

getWindow().addFlags(WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON); 

Che non sembra interferire con il blocco di prossimità.

+0

Non sarebbe disabilitare la schermata di blocco per il mio app? Non voglio farlo, voglio che il lockscreen funzioni correttamente. Solo che non voglio che si blocchi quando non dovrebbe (cioè, quando il sensore di prossimità viene rilasciato e lo schermo si riaccende). Il comportamento previsto è che lo schermo ritorna alla mia app, a meno che un periodo di timeout sufficientemente lungo non abbia abilitato la lockscreen. – user496854

1

Come è riuscito a ripristinare lo schermo? Sono riuscito a spegnere lo schermo, quando il sensore è coperto, utilizzando:

WindowManager.LayoutParams lp = getWindow().getAttributes(); 
lp.buttonBrightness = WindowManager.LayoutParams.BRIGHTNESS_OVERRIDE_OFF; 
lp.screenBrightness = WindowManager.LayoutParams.BRIGHTNESS_OVERRIDE_OFF; 
etWindow().setAttributes(lp); 

e dopo questo, "rilascio" o "resettare" il coperchio dal/sul sensore, non eseguirà l'altra parte il codice:

WindowManager.LayoutParams lp = getWindow().getAttributes(); 
lp.buttonBrightness = WindowManager.LayoutParams.BRIGHTNESS_OVERRIDE_NONE; 
lp.screenBrightness = WindowManager.LayoutParams.BRIGHTNESS_OVERRIDE_NONE; 
etWindow().setAttributes(lp); 
1

Oltre Wakelock da PowerManager è necessario creare blocco KeyGuard come questo:

private WakeLock mWakeLock = null; 
private KeyguardLock mKeyguardLock = null; 

public void enableProximitySensor() { 
    PowerManager pm = (PowerManager) getApplicationContext().getSystemService(Context.POWER_SERVICE); 
    mWakeLock = pm.newWakeLock(PROXIMITY_SCREEN_OFF_WAKE_LOCK, LOG_TAG); 
    mWakeLock.acquire(); 

    KeyguardManager km = (KeyguardManager) getApplicationContext().getSystemService(Context.KEYGUARD_SERVICE); 
    mKeyguardLock = mManager.newKeyguardLock(KEYGUARD_TAG); 
} 

public void disableProximitySensor() { 
    if (null != mWakeLock) { 
    mWakeLock.release(); 
    mWakeLock = null; 
    } 
    if (null != mKeyguardLock) { 
    mKeyguardLock.disableKeyguard(); 
    mKeyguardLock = null; 
    } 
} 

creare questa serratura soltanto per lo stesso tempo, come si acquisiscono blocco vicinanza scia e schermata di blocco sarà w tieni tutto il tempo nella tua applicazione.

+0

Come impedirebbe l'arresto della schermata di blocco? – user496854

+0

Bene, questa soluzione mi ha aiutato nella stessa situazione =) Ho affrontato lo stesso problema - dopo che il telefono si allontana dalla schermata di blocco dell'orecchio appare. L'uso di KeyguardLock mi aiuta. Il codice di esempio è stato modificato un po 'per chiarire i miei pensieri. –

+0

Vale la pena notare che questo richiede un permesso aggiuntivo (DISABLE_KEYGUARD) –

0

Se è appropriato per la vostra applicazione è possibile utilizzare

getWindow().addFlags(LayoutParams.FLAG_SHOW_WHEN_LOCKED | LayoutParams.FLAG_IGNORE_CHEEK_PRESSES); 
0
private WakeLock mProximityWakeLock= null; 

mProximityWakeLock= pm.newWakeLock(PowerManager.FULL_WAKE_LOCK|PowerManager.ACQUIRE_CAUSES_WAKEUP , LOG_TAG); 

L'acquisizione di blocco quando lo schermo necessario per accendere e rilasciando quando necessario, per via cioè invertire sopra Wakelock funzionerà bene.

1

Io uso questo codice

import android.content.Context; 
import android.os.PowerManager; 
import android.support.v7.app.AppCompatActivity; 
import android.os.Bundle; 
import android.util.Log; 
import android.view.View; 
import android.widget.Toast; 

public class MainActivity extends AppCompatActivity { 

    private PowerManager mPowerManager; 
    private PowerManager.WakeLock mWakeLock; 

    private static final String TAG = "MainActivity"; 

    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.activity_main); 

     mPowerManager = (PowerManager) getSystemService(Context.POWER_SERVICE); 
    } 

    public void activateSensor(View v) { 
     Toast.makeText(MainActivity.this, "Proximity On", Toast.LENGTH_LONG).show(); 
     if (mWakeLock == null) { 
      mWakeLock = mPowerManager.newWakeLock(PowerManager.PROXIMITY_SCREEN_OFF_WAKE_LOCK, "incall"); 
     } 
     if (!mWakeLock.isHeld()) { 
      Log.d(TAG, "New call active : acquiring incall (CPU only) wake lock"); 
      mWakeLock.acquire(); 
     } else { 
      Log.d(TAG, "New call active while incall (CPU only) wake lock already active"); 
     } 
    } 

    public void deactivateSensor(View v) { 
     Toast.makeText(MainActivity.this, "Proximity Off", Toast.LENGTH_LONG).show(); 
     if (mWakeLock != null && mWakeLock.isHeld()) { 
      mWakeLock.release(); 
      Log.d(TAG, "Last call ended: releasing incall (CPU only) wake lock"); 
     } else { 
      Log.d(TAG, "Last call ended: no incall (CPU only) wake lock were held"); 
     } 
    } 

} 

Nel manifesto:

<uses-permission android:name="android.permission.WAKE_LOCK" /> 

Nel mio layout:

<?xml version="1.0" encoding="utf-8"?> 
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" 
    xmlns:tools="http://schemas.android.com/tools" 
    android:layout_width="match_parent" 
    android:layout_height="match_parent" 
    android:paddingBottom="@dimen/activity_vertical_margin" 
    android:paddingLeft="@dimen/activity_horizontal_margin" 
    android:paddingRight="@dimen/activity_horizontal_margin" 
    android:paddingTop="@dimen/activity_vertical_margin" 
    tools:context="com.example.proximitysensor.MainActivity"> 

    <Button 
     android:layout_width="match_parent" 
     android:layout_height="wrap_content" 
     android:layout_above="@+id/activity_main_turn_on_screen" 
     android:onClick="activateSensor" 
     android:text="@string/activity_main_activate_sensor" /> 

    <Button 
     android:id="@+id/activity_main_turn_on_screen" 
     android:layout_width="match_parent" 
     android:layout_height="wrap_content" 
     android:layout_alignParentBottom="true" 
     android:onClick="deactivateSensor" 
     android:text="@string/activity_main_deactivate_sensor" /> 
</RelativeLayout> 
+0

Codice molto bello, buon lavoro! Ho una domanda Posso semplicemente spegnere il display usando il tuo codice con ** solo il pulsante premi **? (nessun sensore di prossimità!) – Dake

+0

Non so senza sensore di prossimità ... puoi controllare questo [collegamento] (http://stackoverflow.com/questions/6756768/turn-off-screen-on-android) .. . scusa. – Cabezas

+0

Nessun problema. C'è un piccolo problema però. Il codice corrente disattiva il display ma "mette in pausa" qualsiasi app aperta. Ad esempio, se il display si spegne durante una partita, il gioco viene "messo in pausa". ** Voglio solo spegnere il display ** e mantenere il dispositivo in funzione normalmente. È possibile? – Dake