2011-11-10 14 views
9

Estoy intentando averiguar cómo despertar y desbloquear el teléfono con un servicio. Me he estado refiriendo a la publicación this, pero no puedo entender por qué no está funcionando. Este es el código que tengo hasta ahora:Android: Despierta y desbloquea el teléfono

public class WakephoneActivity extends Activity { 

    BroadcastReceiver mReceiver; 

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

      @Override 
      public void onReceive(Context context, Intent intent) { 
       // Log.v(TAG, "Screen OFF onReceive()"); 
       screenOFFHandler.sendEmptyMessageDelayed(0, 2000); 
      } 
     }; 
    } 

    private Handler screenOFFHandler = new Handler() { 

     @Override 
     public void handleMessage(Message msg) { 
      super.handleMessage(msg); 
      // do something 
      // wake up phone 
      // Log.i(TAG, "ake up the phone and disable keyguard"); 
      PowerManager powerManager = (PowerManager) WakephoneActivity.this 
        .getSystemService(Context.POWER_SERVICE); 
      long l = SystemClock.uptimeMillis(); 
      powerManager.userActivity(l, false);// false will bring the screen 
      // back as bright as it was, true - will dim it 
     } 
    }; 

    protected void onResume() { 
     super.onResume(); 
     IntentFilter filter = new IntentFilter(Intent.ACTION_SCREEN_OFF); 
     registerReceiver(mReceiver, filter); 
     // Log.i(TAG, "broadcast receiver registered!"); 
    } 
} 

He agregado el código en el manifiesto también. ¿Algunas ideas?

+0

Creo que se puede eliminar la configuración del bloqueo de alguna manera, lo que puede despertar el teléfono directamente en su actividad. – njzk2

Respuesta

14

Utilice este código a continuación en su servicio.

PowerManager pm = (PowerManager) getApplicationContext().getSystemService(Context.POWER_SERVICE); 
     mWakeLock = pm.newWakeLock((PowerManager.SCREEN_DIM_WAKE_LOCK | PowerManager.ACQUIRE_CAUSES_WAKEUP), "YourServie"); 
     mWakeLock.acquire(); 
     [...] 
     mWakeLock.release(); 

Si desea desbloquear la pantalla, así, registrar un receptor en su servicio que vigila si la pantalla se enciende/apaga y si se apaga y se desea desbloquear el teléfono, iniciar una actividad con este código en onCreate:

Window window = getWindow(); 
window.addFlags(WindowManager.LayoutParams.FLAG_DISMISS_KEYGUARD); 
this.finish(); 
return; 

que sé, este es un lugar sucio, pero por lo que yo sé, no hay otra manera de desbloquear la pantalla de bloqueo (y esto sólo funcionará si no hay contraseñas, etc. establecer, por lo que debe ser la pantalla normal de "deslizar para desbloquear").

y no se olvide de añadir android.permission.WAKE_LOCK ;-)

/edit: acabo de ver que ya está usando una actividad. Si tiene uno y no necesita el servicio en absoluto, simplemente ponga este código en la actividad.

1

Para que el servicio sea Allways activa es necesario tener este permiso en el manifiesto:

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

Otra cosa que hay que hacer es Adquirir un WakeLock. Sin él, el servicio terminará en algún momento. Puede hacerlo de esta manera:

getApplicationContext(); 
PowerManager pm = (PowerManager)getApplicationContext().getSystemService(Context.POWER_SERVICE); 
WakeLock wl = pm.newWakeLock(PowerManager.PARTIAL_WAKE_LOCK, TAG); 
wl.acquire(); 

Es posible que tenga que cambiar PowerManager.PARTIAL_WAKE_LOCK a la que necesita. Puede ver información sobre ese here.

1

Hay WakefulBroadcastReceiver que hace esto por usted. Ejemplo del uso:

import android.content.Context; 
import android.content.Intent; 
import android.os.SystemClock; 
import android.support.v4.content.WakefulBroadcastReceiver; 
import android.util.Log; 

public class SimpleWakefulReceiver extends WakefulBroadcastReceiver { 
    @Override 
    public void onReceive(Context context, Intent intent) { 
     // This is the Intent to deliver to our service. 
     Intent service = new Intent(context, SimpleWakefulService.class); 

     // Start the service, keeping the device awake while it is launching. 
     Log.i("SimpleWakefulReceiver", "Starting service @ " + SystemClock.elapsedRealtime()); 
     startWakefulService(context, service); 
    } 
} 

Después de completar la acción en el servicio, llame SimpleWakefulReceiver.completeWakefulIntent(intent) para liberar el bloqueo estela.

(como @Force ya le dio los detalles sobre el wakeLock, que no será necesario repetir aquí ;-)

Cuestiones relacionadas