首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >安卓:如何使用PowerManager.wakeUp?

安卓:如何使用PowerManager.wakeUp?
EN

Stack Overflow用户
提问于 2013-03-22 03:36:53
回答 3查看 6.1K关注 0票数 1

我想使用PowerManager的wakeUp方法。Eclipse (ADT)不识别此方法。但是对于相反的"goToSleep“来说没有问题:

代码语言:javascript
复制
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错误:

代码语言:javascript
复制
The method wakeUp(long) is undefined for the type PowerManager

Eclipse向我提出了一个快速修复方案,但我也犯了同样的错误:

代码语言:javascript
复制
((Object) pm).wakeUp(SystemClock.uptimeMillis()); //the same error 

这是个bug还是我的问题?谢谢!

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2013-03-22 03:53:30

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

此外,它还需要DEVICE_POWER权限,只有使用与固件签名相同的签名密钥签名的应用程序才能持有该权限。

票数 5
EN

Stack Overflow用户

发布于 2015-01-06 20:02:59

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

请看我的另一个answer,我在这里更详细地解释了什么是设置。

票数 1
EN

Stack Overflow用户

发布于 2019-10-22 19:38:10

您应该了解一下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权限:

代码语言:javascript
复制
<uses-permission android:name="android.permission.WAKE_LOCK" />

到API level 29为止的API文档相当令人困惑,因为ACQUIRE_CAUSES_WAKEUP标志必须与一个有效的级别组合,否则PowerManager将抛出一个IllegalArgumentException必须指定一个有效的唤醒锁级别。

遗憾的是,所有可用级别要么已被弃用,要么明确不允许与此标志组合:

  1. PARTIAL_WAKE_LOCK:不能与标记一起使用flag
  2. SCREEN_DIM_WAKE_LOCK:不推荐使用,因为17
  3. SCREEN_BRIGHT_WAKE_LOCK:不推荐使用ACQUIRE_CAUSES_WAKEUP 15
  4. FULL_WAKE_LOCK:不推荐使用因为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实现如下所示(请注意,我倾向于让用户启用/禁用唤醒功能,并定义一个方法来在应用程序被终止时释放唤醒锁/onDestroy):

代码语言:javascript
复制
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!");
    }

}
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/15556508

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档