簡體   English   中英

Android:喚醒和解鎖手機

[英]Android: Wake & unlock phone

我試圖弄清楚如何通過服務喚醒和解鎖手機。 我一直在指這篇文章但是,我無法弄清楚為什么它不起作用。 這是我到目前為止的代碼:

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

我也在清單中添加了代碼。 有任何想法嗎?

請在您的服務中使用以下代碼。

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

/編輯:我剛看到你已經在使用Activity。 如果您有一個並且根本不需要該服務,只需將此代碼放入活動中即可。

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棄用,請參考此處

要使服務始終處於活動狀態,您需要在清單上擁有此權限:

<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更改為您需要的那個。 你可以在這里看到有關的信息。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM