我想使用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
这是一个错误还是仅仅是我? 谢谢!
答案 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>必须指定有效的唤醒锁级别。
不幸的是,所有可用级别已被弃用,或明确不允许与该标志结合使用:
PARTIAL_WAKE_LOCK
:不能与ACQUIRE_CAUSES_WAKEUP
标志一起使用SCREEN_DIM_WAKE_LOCK
:自API 17起不推荐使用SCREEN_BRIGHT_WAKE_LOCK
:自API 15起不推荐使用FULL_WAKE_LOCK
:自API 17起不推荐使用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!");
}
}