Выключите экран на Android
Я пытаюсь включить и выключить дисплей после определенного действия (Давайте просто беспокоиться о выключении экрана на данный момент). Из того, что я понимаю из wake lock, это то, что у меня есть:
PowerManager pm = (PowerManager) getSystemService(Context.POWER_SERVICE);
PowerManager.WakeLock wl = pm.newWakeLock(PowerManager.PARTIAL_WAKE_LOCK, "My Tag");
когда я читаю другие сообщения в stackoverflow и еще где, они, кажется, говорят мне, что PARTIAL_WAKE_LOCK выключит экран. Но если я прочитаю SDK, он говорит, что он только позволит отключить экран. Поэтому я думаю, что это неправильно.
какие-то намеки было бы полезно! Спасибо,
Майк
5 ответов
есть два варианта для выключения экрана:
PowerManager manager = (PowerManager) getSystemService(Context.POWER_SERVICE);
// Choice 1
manager.goToSleep(int amountOfTime);
// Choice 2
PowerManager.WakeLock wl = manager.newWakeLock(PowerManager.PARTIAL_WAKE_LOCK, "Your Tag");
wl.acquire();
wl.release();
вам, вероятно, понадобится это разрешение тоже:
<uses-permission android:name="android.permission.WAKE_LOCK" />
обновление:
попробуйте этот метод; android выключает экран, как только уровень света достаточно низкий.
WindowManager.LayoutParams params = getWindow().getAttributes();
params.flags |= LayoutParams.FLAG_KEEP_SCREEN_ON;
params.screenBrightness = 0;
getWindow().setAttributes(params);
следующее копируется из документ SDK.
Если вы хотите сохранить экран, я думаю SCREEN_BRIGHT_WAKE_LOCK
достаточно.
Flag Value CPU Screen Keyboard
PARTIAL_WAKE_LOCK On* Off Off
SCREEN_DIM_WAKE_LOCK On Dim Off
SCREEN_BRIGHT_WAKE_LOCK On Bright Off
FULL_WAKE_LOCK On Bright Bright
для меня эти методы не работают. Поэтому я использовал другой сценарий (не тривиальный), чтобы отключить экран.
Android имеет 2 флага, которые отвечают за пробуждение:
- Дисплей - > Тайм-Аут Экрана
- Приложения --> Разработка --> бодрствуйте во время зарядки флажок.
я использовал следующий поток:
1-й из всех сохранить предыдущую конфигурацию, например тайм-аут экрана был 1 мин и бодрствуйте во время зарядки проверено.
после того, как я снимите флажок бодрствуйте во время зарядки и установите тайм-аут экрана на минимальное время.
я регистрируюсь в службе широковещательного приемника, чтобы получить событие с android, экран которого выключен.
когда я получил событие на экране, я установил предыдущую конфигурацию по умолчанию: тайм-аут экрана был 1 мин и бодрствовать, пока зарядка проверено.
отменить регистрацию приемника
после 15 сек. устройство спит
вот фрагменты кода:
BroadcastReceiver
import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
/**
* Catch Screen On/Off
* */
public class BroadcastReceiverScreenListener extends BroadcastReceiver{
private BroadCastListenerCallBackItf mBroadCastListenerCallBack = null;
public BroadcastReceiverScreenListener(
BroadCastListenerCallBackItf broadCastListenerCallBack) {
this.mBroadCastListenerCallBack = broadCastListenerCallBack;
}
@Override
public void onReceive(Context arg0, Intent intent) {
if (intent.getAction().equals(Intent.ACTION_SCREEN_OFF)) {
mBroadCastListenerCallBack.broadCastListenerCallBack__ScreenOff_onResponse();
}
}
}
интерфейс используется в качестве обратного вызова
public interface BroadCastListenerCallBackItf {
public void broadCastListenerCallBack__ScreenOff_onResponse();
}
2 метода из основного класса:
....
AndroidSynchronize mSync = new AndroidSynchronize();
....
public void turnScreenOff(int wait){
IntentFilter filter = new IntentFilter(Intent.ACTION_SCREEN_ON);
filter.addAction(Intent.ACTION_SCREEN_OFF);
BroadCastListenerCallBackItf broadCastListenerCallBack = this;
BroadcastReceiver mReceiver = new BroadcastReceiverScreenListener(broadCastListenerCallBack);
m_context.registerReceiver(mReceiver, filter);
//set Development --> disable STAY_ON_WHILE_PLUGGED_IN
Settings.System.putInt(
m_context.getContentResolver(),
Settings.System.STAY_ON_WHILE_PLUGGED_IN,
0 );
// take current screen off time
int defTimeOut = Settings.System.getInt(m_context.getContentResolver(),
Settings.System.SCREEN_OFF_TIMEOUT, 3000);
// set 15 sec
Settings.System.putInt(m_context.getContentResolver(),
Settings.System.SCREEN_OFF_TIMEOUT, 15000);
// wait 200 sec till get response from BroadcastReceiver on Screen Off
mSync.doWait(wait*1000);
// set previous settings
Settings.System.putInt(m_context.getContentResolver(),
Settings.System.SCREEN_OFF_TIMEOUT, defTimeOut);
// switch back previous state
Settings.System.putInt(
m_context.getContentResolver(),
Settings.System.STAY_ON_WHILE_PLUGGED_IN,
BatteryManager.BATTERY_PLUGGED_USB);
m_context.unregisterReceiver(mReceiver);
}
public void broadCastListenerCallBack__ScreenOff_onResponse() {
mSync.doNotify();
}
....
AndroidSynchronize класс!--53-->
public class AndroidSynchronize {
public void doWait(long l){
synchronized(this){
try {
this.wait(l);
} catch(InterruptedException e) {
}
}
}
public void doNotify() {
synchronized(this) {
this.notify();
}
}
public void doWait() {
synchronized(this){
try {
this.wait();
} catch(InterruptedException e) {
}
}
}
}
[EDIT]
вам нужно зарегистрировать разрешение:
android.permission.WRITE_SETTINGS
в этой ссылке, вы также можете отключить экран, как это:
Settings.System.putInt(getContentResolver(), Settings.System.SCREEN_OFF_TIMEOUT, 1000);
1000 находится в миллисекундах, что означает 1 секунду, вы можете заменить его любым значением по желанию.
разрешение:
<uses-permission android:name="android.permission.WRITE_SETTINGS" />
попробовать - wakelock-ов.acquire (1000); / / укажите время , оно гаснет и в конечном итоге выключается.