2011-11-10 4 views
9

Sto cercando di capire come attivare e sbloccare il telefono con un servizio. Mi riferivo al post this ma, non riesco a capire perché non funziona. Questo è il codice che ho finora:Android: Sveglia e sblocca telefono

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!"); 
    } 
} 

Ho aggiunto il codice nel manifest pure. Qualche idea?

+0

penso che si può rimuovere le impostazioni di blocco in qualche modo, in modo da poter riattivare il telefono direttamente sulla vostra attività. – njzk2

risposta

14

Utilizza questo codice di seguito nel tuo servizio.

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(); 

Se si vuole sbloccare lo schermo e, registrare un ricevitore nel vostro servizio che controlla se lo schermo è acceso/spento e se è spento e si vuole sbloccare il telefono, avviare un'attività con questo codice in onCreate:

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

lo so, questo è un piuttosto sporca, ma per quanto ne so, non c'è altro modo di sbloccare la lockscreen (e questo funziona solo se non ci sono le parole d'accesso, ecc impostato, quindi deve essere la normale schermata "slide to unlock").

e non dimenticate di aggiungere android.permission.WAKE_LOCK ;-)

/edit: ho appena visto che si sta già utilizzando un'attività. Se ne hai uno e non hai bisogno del servizio, inserisci questo codice nell'attività.

1

Per il servizio di essere allways attiva è necessario avere questa autorizzazione su manifesti:

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

Un'altra cosa che dovete fare è adquire un Wakelock. Senza di esso il servizio finirà per passare un po 'di tempo. Si può fare in questo modo:

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

Potrebbe essere necessario cambiare PowerManager.PARTIAL_WAKE_LOCK a quello di cui avete bisogno. È possibile visualizzare informazioni su tale here.

1

C'è WakefulBroadcastReceiver che fa questo per voi. uso Esempio:

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); 
    } 
} 

Dopo aver completato l'azione di servizio, chiamare SimpleWakefulReceiver.completeWakefulIntent(intent) per rilasciare il blocco scia.

(come @Force già ti ha dato i dettagli circa la Wakelock, che non è necessario ripetere qui ;-)