9

私はサービスで電話を起こし、ロックを解除する方法を見つけようとしています。私はこの投稿を参照していますが、なぜそれが機能しないのか理解できません。これは私がこれまでに持っているコードです:

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

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

4

3 に答える 3

15

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

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

/ edit:あなたがすでにアクティビティを使用しているのを見ました。持っていてサービスがまったく必要ない場合は、このコードをアクティビティに入れてください。

于 2011-11-21T17:15:05.547 に答える
1

サービスを常にアクティブにするには、マニフェストに対して次の権限が必要です。

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

あなたがする必要があるもう一つのことは、WakeLockを取得することです。それがないと、サービスはしばらく経って終了します。あなたはこのようにそれを行うことができます:

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

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

于 2011-11-10T00:35:25.307 に答える
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に関する詳細を提供しているので、ここで繰り返す必要はありません;-)

クラスはAPIレベル26.1.0から非推奨になっていることに注意してください。ここを参照してください

于 2016-01-27T12:45:46.783 に答える