Android:如何使用PowerManager.wakeUp?

时间:2013-03-21 19:36:53

标签: android wakeup powermanager

我想使用PowerManager的方法wakeUp。 Eclipse(ADT)不会重新使用此方法。但是相反的“goToSleep”没有问题:

PowerManager pm = (PowerManager) MyApplication.getAppContext().getSystemService(Context.POWER_SERVICE);
pm.wakeUp(SystemClock.uptimeMillis()); //Detected as error by eclipse
pm.goToSleep(SystemClock.uptimeMillis()); //Not detected as error and work well

Eclipse错误:

The method wakeUp(long) is undefined for the type PowerManager
Eclipse向我提出了一个quickfix,但我也有同样的错误:

((Object) pm).wakeUp(SystemClock.uptimeMillis()); //the same error 

这是一个错误还是仅仅是我? 谢谢!

3 个答案:

答案 0 :(得分:4)

首先,正如Luksprog所指出的那样,该方法对API级别17来说是新的。

此外,它还需要DEVICE_POWER权限,该权限只能由与用于签署固件的签名密钥签名的应用程序保留。

答案 1 :(得分:1)

我看到你有一个自定义的ROM。 您可以使用sleep()中的wakeUp()uiautomator,从api level 16开始,基本上可以实现与PowerManager wakeUp()和goToSleep()相同的功能,但不受您的权限限制将不会被os(android.permission.DEVICE_POWER)授予。

请参阅我的其他answer,我会更详细地解释设置是什么。

答案 2 :(得分:0)

您应该查看PowerManager WakeLock API,特别是标志ACQUIRE_CAUSES_WAKEUP

  

ACQUIRE_CAUSES_WAKEUP(已在API级别1中添加)

     

public static final int ACQUIRE_CAUSES_WAKEUP

     

唤醒锁定标志:获取唤醒锁定后,打开屏幕。

     

通常,唤醒锁实际上不会唤醒设备,它们只会导致屏幕在打开后仍保持打开状态。将视频播放器应用程序视为正常行为。弹出并希望设备开机的通知是例外。使用此标志就像他们一样。

     

不能与PARTIAL_WAKE_LOCK一起使用。

     

常量值:268435456(0x10000000)

请注意,要使用此功能,您的应用的AndroidMainfest.xml必须使用WAKE_LOCK权限:

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

API级别29以来的API文档相当困惑,因为ACQUIRE_CAUSES_WAKEUP标志必须与有效级别结合使用,否则PowerManager会为您抛出IllegalArgumentException < em>必须指定有效的唤醒锁级别。

不幸的是,所有可用级别已被弃用,或明确不允许与该标志结合使用:

  1. PARTIAL_WAKE_LOCK:不能与ACQUIRE_CAUSES_WAKEUP标志一起使用
  2. SCREEN_DIM_WAKE_LOCK:自API 17起不推荐使用
  3. SCREEN_BRIGHT_WAKE_LOCK:自API 15起不推荐使用
  4. FULL_WAKE_LOCK:自API 17起不推荐使用
  5. PROXIMITY_SCREEN_OFF_WAKE_LOCK:不能与ACQUIRE_CAUSES_WAKEUP标志一起使用

因此,在我的应用中,我决定将ACQUIRE_CAUSES_WAKEUP标志与SCREEN_BRIGHT_WAKE_LOCK结合使用,因为它比FULL_WAKE_LOCK邪恶,而比SCREEN_DIM_WAKE_LOCK更有用。

所以我的wakeUp实现看起来类似于以下内容(请注意,我有一个用户偏好设置来启用/禁用唤醒功能,并且还定义了一种方法,当应用程序被终止/被销毁时释放唤醒锁):< / p>

import android.content.Context;
import android.content.SharedPreferences;

import android.os.Bundle;
import android.os.PowerManager;

import android.util.Log;

import androidx.appcompat.app.AppCompatActivity;
import androidx.appcompat.widget.Toolbar;

import androidx.preference.PreferenceManager;


public class MainActivity extends AppCompatActivity {


    /** Interval of 1 second in milliseconds */
    static final long INTERVAL_SECOND = 1000;

    /** Interval of 1 minute in milliseconds */
    static final long INTERVAL_MINUTE = 60 * INTERVAL_SECOND;

    SharedPreferences sharedPrefs = null;
    PowerManager.WakeLock mWakeLock = null;

    Context applicationContext = null;

    @Override
    protected void onCreate(final Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        final String TAG = "onCreate";
        applicationContext = getApplicationContext();

        setContentView(R.layout.activity_main);
        final Toolbar toolbar = findViewById(R.id.toolbar);
        setSupportActionBar(toolbar);

        PreferenceManager
                .setDefaultValues(this, R.xml.root_preferences, false);
        sharedPrefs = PreferenceManager.getDefaultSharedPreferences(this);
    }

    void wakeUp() {
        final String TAG = "wakeUp";
        if (sharedPrefs == null) {
            Log.w(TAG, "Shared Preferences was null");
            return;
        }
        final boolean isWakeUpPref = SettingsActivity.isWakelockPref(sharedPrefs);
        if (!isWakeUpPref) {
            Log.i(TAG, "WakeUp is disabled via preference");
            return;
        }
        Log.i(TAG, "WakeUp is enabled via preference");
        if (mWakeLock == null) {
            Log.i(TAG, "Creating WakeLock...");
            final PowerManager pm = (PowerManager) getSystemService(Context.POWER_SERVICE);
            if (pm == null) {
                Log.w(TAG, "could not get Power Service");
                return;
            }
            mWakeLock = pm.newWakeLock(PowerManager.SCREEN_BRIGHT_WAKE_LOCK | PowerManager.ACQUIRE_CAUSES_WAKEUP, "MyApp:wakeup");
            Log.i(TAG, "WakeLock created!");
        } else if (mWakeLock.isHeld()) {
            Log.i(TAG, "Releasing old WakeLock, to reacquire with fresh timeout");
            mWakeLock.release();
        }
        Log.i(TAG, "Acquiring WakeLock to WakeUp...");
        mWakeLock.acquire(INTERVAL_MINUTE);
        Log.i(TAG, "WakeLock WakeUp acquired!");
    }

    void releaseWakeLock() {
        final String TAG = "releaseWakeLock";
        if (mWakeLock == null) {
            return;
        }
        if (!mWakeLock.isHeld()) {
            Log.w(TAG, "WakeLock not held!");
            return;
        }
        mWakeLock.release();
        Log.i(TAG, "WakeLock released!");
    }

}