2011-11-10 11 views
9

私はサービスで電話機を起きてロックを解除する方法を理解しようとしています。私はthisの投稿を参照していますが、なぜ動作していないのかわかりません。これは私がこれまで持っているコードです:Android:目覚まし/電話の解除

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

私はマニフェストにもコードを追加しました。何か案は?

+0

繰り返す必要はない私はあなたがあなたの活動に直接電話を覚ますことができますので、あなたが、何とかロックの設定を削除することができると思います。 – njzk2

答えて

14

サービスでこのコードを使用してください。

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

あなたは、同様に画面のロックを解除画面をオン/オフし、それがオフになっている場合された場合に監視し、あなたのサービスのレシーバを登録したいとあなたは携帯電話のロックを解除したい場合は、活動を開始onCreateでこのコードで:

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

私が知っている、これはかなり汚いですが、私の知る限りでは、ロック画面のロックを解除する他の方法はありません(とはパスワードなどが存在しない場合にのみ動作します設定すると、通常の「スライドからロックを解除する」画面でなければなりません)。

そしてandroid.permission.WAKE_LOCK ;-)

/編集を追加することを忘れないでください:私はちょうどあなたがすでに活動を使用していました。あなたが持っていてサービスを一切必要としない場合は、このコードをアクティビティに入れてください。

1

サービスは、あなたがマニフェストにこの権限を持っている必要がありますオールウェイズアクティブにするためには:

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

あなたがする必要があるもう一つはWakeLockをadquireすることです。それがなければ、サービスはしばらく時間を過ぎて終了します。

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

あなたはあなたが必要とするものにPowerManager.PARTIAL_WAKE_LOCKを変更する必要があります:あなたはこのようにそれを行うことができます。そのhereについての情報を見ることができます。

1

WakefulBroadcastReceiverがあります。使用例:

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

サービスでアクションを完了した後、ウェイクロックを解除するためにSimpleWakefulReceiver.completeWakefulIntent(intent)を呼び出します。 @ForceはすでにあなたにwakeLockの詳細を与えたとして

は(、彼らがここ;-)