Android: оставить светодиод камеры включенным после выключения экрана

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

У меня есть служба, которая включает светодиод камеры onCreate:

@Override
public void onCreate() {
// make sure we don't sleep
this.pm = (PowerManager) getSystemService(Context.POWER_SERVICE);
this.mWakeLock = pm.newWakeLock(PowerManager.PARTIAL_WAKE_LOCK, "SleepLED");

    this.mTimer = new Timer();
    this.mTimerTask = new TimerTask() {
        public void run() {
        // turn on the LED
        setFlashlight(Camera.Parameters.FLASH_MODE_TORCH);

        mWakeLock.acquire();
        }
    };

    // Get the notification-service
    this.mNM = (NotificationManager)getSystemService(NOTIFICATION_SERVICE);
    // Display a notification about us starting.  We put an icon in the status bar.
    showNotification();

    // Open camera
    this.frontCam = Camera.open();
    this.frontCamPara = frontCam.getParameters();
    this.frontCam.lock();


    // Schedule the TimerTask
    this.mTimer.schedule(mTimerTask, 0);
}

Я могу сказать, что WakeLock срабатывает, я тестировал с FULL_WAKE_LOCK, и он не отключался из-за тайм-аута экрана. Но поскольку экран не обязательно должен быть включен, я не хочу использовать полную блокировку пробуждения.

Cyanogenmod для моего телефона (HTC Legend) содержит приложение-фонарик, которое может делать то, что я хочу. Его исходный код находится здесь:
https://github.com/CyanogenMod/android_packages_apps_Torch/tree/gingerbread/src/net/cactii/flash2
Я заметил, что в этом приложении свет на короткое время выключается, если это намек для кого-то, то явно не для меня ;(

Я не ожидаю, что кто-то изменит мой код, чтобы делать то, что я хочу, но я был бы благодарен, если бы кто-нибудь мог указать мне правильное направление!

Приветствую
SJ


person stefanjunker    schedule 08.11.2011    source источник


Ответы (3)


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

@Override
public void onCreate() {
    // assume we start with screen on and save that state ;-)
    this.pm = (PowerManager) getSystemService(Context.POWER_SERVICE);
    screenOn = this.pm.isScreenOn();

    // program a timer which checks if the light needs to be re-activated
    this.mTimer = new Timer();
    this.mTimerTask = new TimerTask() {
        public void run() {
            // re-activate the LED if screen turned off
            if(!pm.isScreenOn() && pm.isScreenOn() != screenOn) {
                Log.i("SleepLEDservice", "re-activated the LED");

                // really it's NOT ENOUGH to just "turn it on", i double-checked this
                setFlashlight(Camera.Parameters.FLASH_MODE_OFF);
                setFlashlight(Camera.Parameters.FLASH_MODE_TORCH);
            }
            screenOn = pm.isScreenOn();                 
        }
    };
}

private void setFlashlight(String newMode) {
    try {
        this.frontCamPara = this.frontCam.getParameters();
        if(this.frontCamPara.getFlashMode() != newMode) {
            this.frontCamPara.setFlashMode(newMode);
            this.frontCam.setParameters(frontCamPara);  
        }
    } catch (Exception e) {
        e.printStackTrace();
    }
}

Ключ меняет состояние обратно на FLASH_MODE_OFF, а затем обратно на FLASH_MODE_TORCH.

person stefanjunker    schedule 17.11.2011
comment
Мне удалось добиться этого с помощью небольшой модификации логики кода. 1. Я не выпускал экземпляр класса Camera в теле метода OnStop(), так как выпуск класса Camera() был основным виновником выключения светодиода. 2. Использование логики повторной активации светодиода в методе onPause() класса активности. - person Utkarsh Mankad; 09.03.2015

Я не знаю, принадлежит ли HTC к этому лагерю, но некоторые устройства (особенно Moto Droid) не могут использовать камеру при выключенном экране — они услужливо предполагают, что вы никогда не захотите использовать свой телефон таким образом. Если экран блокируется, приложение, использующее камеру, переводится в фоновый режим и перестает работать.

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

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

person ProjectJourneyman    schedule 16.11.2011

Я сделал что-то похожее на stefanjunkers, но у меня были проблемы с его работой, свет иногда снова включался и оставался включенным, а иногда снова включался, а затем снова быстро выключался. Немного повозившись, я обнаружил, что приостановка потока на мгновение решила эту проблему:

setFlashlight(Camera.Parameters.FLASH_MODE_OFF);
try {
Thread.sleep(200);
} catch (InterruptedException e) {
e.printStackTrace();
}
setFlashlight(Camera.Parameters.FLASH_MODE_TORCH);
person BlueJam    schedule 14.01.2014