Подтвердить что ты не робот

Как заставить Android WakeLock работать?

Мой WakeLock не поддерживает мое устройство.

В OnCreate() у меня есть:

PowerManager pm = (PowerManager) getSystemService(Context.POWER_SERVICE);
mWakeLock = pm.newWakeLock(PowerManager.SCREEN_DIM_WAKE_LOCK | PowerManager.ON_AFTER_RELEASE, "My Tag");
mWakeLock.acquire();

то

new CountDownTimer(1320000, 200) {

    public void onTick(long millisUntilFinished) {
        // I update a progress bar here.                                         
    }

    public void onFinish() {
        // I finish updating the progress bar.
        mWakeLock.release();
    }
}.start();

Экран выключается до окончания таймера, как я могу заставить экран оставаться видимым?

mWakeLock - это поле, ранее объявленное так:

private PowerManager.WakeLock mWakeLock;

Мое устройство использует Android 1.6. Я бы очень признателен за любую помощь, чтобы решить эту проблему.

4b9b3361

Ответ 1

WakeLock обычно не вызывает проблем с перезагрузкой. В вашем кодировании могут быть и другие проблемы. WakeLock сильно заряжает аккумулятор, если его не выпускать после использования.

WakeLock - это неэффективный способ сохранения экрана. Вместо этого используйте WindowManager для создания магии. Следующая строка будет достаточной для Wake Wake. Для этого также требуется разрешение WakeLock. Также этот код более эффективен, чем wakeLock.

getWindow().addFlags(WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON);

Вам не нужно связывать Wake Wake в ручном режиме. Этот код позволит Android-системе автоматически обрабатывать блокировку. Когда ваше приложение находится в Foreground, Wake Wake удерживается, а система Android автоматически освобождает блокировку.

Попробуйте это и опубликуйте свой комментарий...

Ответ 2

У вас есть требуемый permission, указанный в вашем манифесте?

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

Ответ 3

Вам просто нужно написать это:

 private PowerManager.WakeLock wl;

    protected void onCreate(Bundle savedInstanceState) {
               super.onCreate(savedInstanceState);
            setContentView(R.layout.main);

            PowerManager pm = (PowerManager) getSystemService(Context.POWER_SERVICE);
            wl = pm.newWakeLock(PowerManager.FULL_WAKE_LOCK, "DoNjfdhotDimScreen");
    }//End of onCreate

            @Override
        protected void onPause() {
            super.onPause();
            wl.release();
        }//End of onPause

        @Override
        protected void onResume() {
            super.onResume();
            wl.acquire();
        }//End of onResume

а затем добавьте разрешение в файл манифеста

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

Теперь ваша деятельность будет всегда бодрствовать. Вы можете делать другие вещи, такие как w1.release() согласно вашему требованию.

Ответ 4

Добавить разрешение в AndroidManifest.xml, как указано ниже

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

желательно ПЕРЕД тегами объявления <application>, но ПОСЛЕ тегов <manifest>, попробуйте сделать способ onCreate() содержать только экземпляр WakeLock.

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    PowerManager pm = (PowerManager)getSystemService(Context.POWER_SERVICE);
    mWakeLock = pm.newWakeLock(PowerManager.SCREEN_DIM_WAKE_LOCK | PowerManager.ON_AFTER_RELEASE, "My Tag");
}

а затем в вашем методе onResume()

@Override
public void onResume() {
   mWakeLock.aquire();
}

и в вашем методе onFinish()

@Override
public void onFinish() {
   mWakeLock.release();
}

Ответ 5

Для достижения той же самой программы вы можете использовать следующие

getWindow().addFlags(WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON);

или добавление следующего в макете также выполнит вышеуказанную задачу

 android:keepScreenOn="true"

Детали, которые вы можете получить из следующего URL-адреса http://developer.android.com/training/scheduling/wakelock.html

Я использовал комбинацию следующего, чтобы разбудить мой экран при блокировке блокировки клавиатуры и сохранить экран на

getWindow().addFlags(WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON);
getWindow().addFlags(WindowManager.LayoutParams.FLAG_TURN_SCREEN_ON);
getWindow().addFlags(WindowManager.LayoutParams.FLAG_DISMISS_KEYGUARD);

Ответ 6

Включить экран

Первый способ:

getWindow().addFlags(WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON);

Второй способ:

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:keepScreenOn="true">
    ...
</RelativeLayout>

Включить CPU:

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

и

PowerManager powerManager = (PowerManager) getSystemService(POWER_SERVICE);
WakeLock wakeLock = powerManager.newWakeLock(PowerManager.PARTIAL_WAKE_LOCK, "MyWakelockTag");
wakeLock.acquire();

Чтобы освободить блокировку слежения, вызовите wakelock.release(). Это освобождает ваше требование к CPU. Очень важно освободить замок после того, как ваше приложение закончит его использование, чтобы не разряжать батарею.

Docs здесь.

Ответ 7

У меня такая же проблема. Я могу заставить экран оставаться включенным, но если я использую частичную блокировку слежения и экран выключен, моя функция onFinish не вызывается до тех пор, пока экран не будет включен.

Вы можете проверить свою блокировку бодрствования, используя mWakeLock.isHeld(), прежде всего, чтобы убедиться, что вы ее получите. Самый простой способ - добавить это к коду, установить в нем отладочную точку останова, а затем проверить его.

В моем случае, я получаю это, но частичный замок следа, кажется, ничего не делает. Здесь мой рабочий код для блокировки экрана.

protected void setScreenLock(boolean on){
        if(mWakeLock == null){
            PowerManager pm = (PowerManager) getSystemService(Context.POWER_SERVICE);
            mWakeLock = pm.newWakeLock(PowerManager.SCREEN_DIM_WAKE_LOCK |
                                        PowerManager.ON_AFTER_RELEASE, TAG);
        }
        if(on){
         mWakeLock.acquire();
        }else{
            if(mWakeLock.isHeld()){
                mWakeLock.release();
            }
         mWakeLock = null;
        }

    }

ДОПОЛНЕНИЕ:

Пользователи Droid Eris и DROID сообщают мне, что это НЕ работает на их устройствах, хотя отлично работает на моем G1. На каком устройстве вы тестируете? Я думаю, что это может быть ошибка Android.

Ответ 8

Спасибо за эту тему. Мне было трудно выполнить таймер в моем коде в течение 5 минут, чтобы запустить мероприятие, потому что мой телефон, который я установил для отключения/сна около 2 минут. С приведенной выше информацией, похоже, мне удалось найти работу.

    @Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);

    /* Time Lockout after 5 mins */
    getWindow().addFlags(LayoutParams.FLAG_KEEP_SCREEN_ON);

    Timer timer = new Timer();
    timer.schedule(new TimerTask() {

       public void run() {

        Intent i = new Intent(AccountsList.this, AppEntryActivity.class);
        i.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
        startActivity(i);
        finish();
        return;

       }

    }, 300000); 
    /* Time Lockout END */
 }

Ответ 10

{PowerManager mgr = (PowerManager)context.getSystemService(Context.POWER_SERVICE);
WakeLock wakeLock = mgr.newWakeLock(PowerManager.PARTIAL_WAKE_LOCK,"MyWakeLock"); 
wakeLock.acquire();}

используйте этот код и не забудьте разрешить wakelock в манифесте android

Ответ 11

Убедитесь, что mWakeLock не был случайно очищен, прежде чем вы готовы его освободить. Если он будет завершен, замок будет выпущен. Это может произойти, например, если вы установили его равным null и впоследствии будет запущен сборщик мусора. Это также может произойти, если вы случайно установили локальную переменную с тем же именем вместо переменной уровня метода.

Я также рекомендую проверять LogCat для записей с тегом PowerManagerService или тега, который вы передаете на newWakeLock.

Ответ 13

Добавить разрешение в AndroidManifest.xml:

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

Затем добавьте код в my.xml:

android:keepScreenOn="true"

в этом случае никогда не отключит страницу! Вы можете прочитать это