Датчик приближения с проблемой wakelock: не удается снова включить экран

Я искал последние дни, и ни один из ответов на поставленные вопросы мне не помог, и я натыкаюсь на голову чем-то, что, возможно, легко решить .... Я хочу работать с датчиком приближения и что я делаю, так это то, что если я приложу палец к датчику, экран выключится, а если я уберу палец, он снова включится! Я успешно выключаю экран и получаю сообщение "Log.i (" информация "," пытаюсь включить! ")", Когда убираю палец, но почему-то экран не включается ... Я пробовал с wakelock (прокомментировал) и с флагами безуспешно! Если я уберу палец, подсветка на клавиатуре загорится, но экран не будет ... Если я нажму кнопку питания два раза, экран включится успешно! Может ли кто-нибудь помочь мне с этим? :(

@Override
public void onSensorChanged(SensorEvent event) {
        if(event.sensor.getType()==Sensor.TYPE_PROXIMITY){
    ProximityReading.setText("\nProximity Sensor Reading:" + String.valueOf(event.values[0]));
    }

        if(event.values[0] == 0) {
      WindowManager.LayoutParams params = getWindow().getAttributes();
      getWindow().addFlags(WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON);
          getWindow().addFlags(WindowManager.LayoutParams.FLAG_DISMISS_KEYGUARD);
      getWindow().addFlags(WindowManager.LayoutParams.FLAG_TURN_SCREEN_ON);
      params.screenBrightness = 0f;
      getWindow().setAttributes(params);
            } else {
          WindowManager.LayoutParams params = getWindow().getAttributes();
      params.screenBrightness = 1f;
      getWindow().setAttributes(params);

      /*powermanager = (PowerManager) getSystemService(Context.POWER_SERVICE);
        wakeLock = powermanager.newWakeLock(PowerManager.ACQUIRE_CAUSES_WAKEUP, "TAG");
      wakeLock.acquire();

      Log.i("info", "trying to turn on!");

    }
}

person user1782638    schedule 29.01.2013    source источник


Ответы (3)


если вы хотите включить экран, вы можете использовать API, например TurnScreenOn в PowerManager, или использовать ACQUIRE_CAUSES_WAKEUP в сочетании с FULL_WAKE_LOCK

person cyc    schedule 29.01.2013
comment
к сожалению, он просто не работает :( выключает экран, но больше не включается .. И я не могу найти TurnScreenOn в PowerManager :( - person user1782638; 29.01.2013
comment
В документации говорится This constant was deprecated in API level 17. Most applications should use FLAG_KEEP_SCREEN_ON instead of this type of wake lock, as it will be correctly managed by the platform as the user moves between applications and doesn't require a special permission. - person anandbibek; 14.12.2015

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

public void unlockAndPowerup(){
    KeyguardManager km = (KeyguardManager) mContext.getSystemService(Context.KEYGUARD_SERVICE);
    final KeyguardManager.KeyguardLock kl = km.newKeyguardLock("MyKeyguardLock");
    kl.disableKeyguard();

    PowerManager pm = (PowerManager) getSystemService(Context.POWER_SERVICE); 
    WakeLock wakeLock = pm.newWakeLock(PowerManager.FULL_WAKE_LOCK
            | PowerManager.ACQUIRE_CAUSES_WAKEUP
            | PowerManager.ON_AFTER_RELEASE, "MyWakeLock");

    wakeLock.acquire();
    wakeLock.release();
    kl.reenableKeyguard();
}
person Deepak Negi    schedule 12.11.2014
comment
Здесь используется устаревший API, как указано в документации This constant was deprecated in API level 17. Most applications should use FLAG_KEEP_SCREEN_ON instead of this type of wake lock, as it will be correctly managed by the platform as the user moves between applications and doesn't require a special permission. - person anandbibek; 14.12.2015

Ваша процедура неправильная. Это может сработать на некоторых устройствах случайно, но это не способ сделать это.

  1. FLAG_TURN_SCREEN_ON должен быть применен к методу onCreate действия. Вам необходимо изменить логику вашего приложения.

  2. У вас неправильная техника отключения экрана. Вы изменяете яркость, это хакерский способ, и вы можете вообще не выключать экран и разряжать батарею. Вам нужно добиться этого с помощью разрешения администратора устройства. Это официальный способ сделать это

Пример кода блокировки

public static void lockNow(Context c) {
    DevicePolicyManager dpm = (DevicePolicyManager)c.getSystemService(Context.DEVICE_POLICY_SERVICE);
    if(dpm.isAdminActive(new ComponentName(c.getApplicationContext(),DeviceAdmin.class)))
        dpm.lockNow();
}

DeviceAdmin.java

import android.app.admin.DeviceAdminReceiver;
public class DeviceAdmin extends DeviceAdminReceiver {
}

В манифесте

<receiver
        android:name=".admin.DeviceAdmin"
        android:permission="android.permission.BIND_DEVICE_ADMIN" >
        <meta-data
            android:name="android.app.device_admin"
            android:resource="@xml/admin" />

        <intent-filter>
            <action android:name="android.app.action.DEVICE_ADMIN_ENABLED" />
        </intent-filter>
    </receiver>

И запрашивая разрешение администратора устройства

private void askAdminPerm(){
    Intent intent = new Intent(DevicePolicyManager.ACTION_ADD_DEVICE_ADMIN);
    intent.putExtra(DevicePolicyManager.EXTRA_DEVICE_ADMIN,
            new ComponentName(root.getContext(), DeviceAdmin.class));
    intent.putExtra(DevicePolicyManager.EXTRA_ADD_EXPLANATION, getString(R.string.lock_msg_big));
    startActivity(intent);
}
person anandbibek    schedule 26.11.2015