2011-11-10 11 views
9

Próbuję dowiedzieć się, jak obudzić i odblokować telefon za pomocą usługi. Odnoszę się do this post, ale nie mogę zrozumieć, dlaczego to nie działa. Jest to kod, który mam do tej pory:Android: Obudź i odblokuj telefon

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

Dodałem kod w manifeście, jak również. Jakieś pomysły?

+0

myślę, że można usunąć ustawienia blokady w jakiś sposób, aby można było obudzić telefonu bezpośrednio na swojej działalności. – njzk2

Odpowiedz

14

Użyj tego kodu poniżej w swoim serwisie.

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

Jeśli chcesz odblokować ekran, jak również, zarejestrować odbiornik w usłudze, która monitoruje, czy ekran jest włączony/wyłączony, a jeśli jest on wyłączony i chcesz odblokować telefon, rozpocząć działalność z tego kodu w onCreate:

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

wiem, jest to raczej brudny, ale o ile mi wiadomo, nie ma innego sposobu pozbycia lockscreen (i to będzie działać tylko wtedy, gdy nie ma żadnych haseł itp ustawić, więc musi to być normalny ekran "przesuń do odblokowania").

I nie zapomnij dodać android.permission.WAKE_LOCK ;-)

/edit: Właśnie widziałem już używasz aktywność. Jeśli masz taką usługę i nie potrzebujesz jej wcale, po prostu wpisz ten kod do działania.

1

Dla usługa będzie aktywna zawsze dobrze trzeba mieć tego uprawnienia na manifeście:

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

Inną rzeczą, którą musisz zrobić, to adquire się blokada wybudzenia. Bez niego usługa zakończy się na jakiś czas. Można to zrobić tak:

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

Być może trzeba zmienić PowerManager.PARTIAL_WAKE_LOCK do tego, że trzeba. Możesz zobaczyć informacje o tym here.

1

Istnieje WakefulBroadcastReceiver, który robi to za Ciebie. Przykład użycia:

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

Po zakończeniu działań w służbie, zadzwoń SimpleWakefulReceiver.completeWakefulIntent(intent) aby zwolnić blokadę budzić.

(jak @Force już dał wam szczegóły dotyczące blokada wybudzenia, one nie muszą być powtórzone tutaj ;-)

Powiązane problemy