Android:屏幕关闭后保持相机LED亮起

时间:2011-11-08 18:57:19

标签: android camera wakelock led flashlight

由于我刚开始使用Android编码,我犹豫是否发布了我的问题,但现在我正处于无法抗拒的地步。

我有一项服务可以打开摄像机LED 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

3 个答案:

答案 0 :(得分:2)

我找到了解决问题的方法。 当手机关闭屏幕时,它会取消激活相机LED,但它允许用户重新激活它,如下所示:

@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。

答案 1 :(得分:1)

我不知道HTC是否在这个阵营中,但是当屏幕关闭时,有些设备(特别是Moto Droid)无法使用相机 - 他们有理由认为你绝对不想以这种方式使用手机。如果屏幕锁定,使用相机的应用程序将被放入后台并停止运行。

结果是我见过的安全摄像头/网络摄像头应用程序具有调暗/黑屏的功能,但实际上并不允许它锁定。这可确保相机继续运行。

我怀疑因为LED被认为是相机硬件的一部分,所以它面临同样的限制。

答案 2 :(得分:0)

我做了一些类似于stefanjunkers的事情,但是在使用它时遇到了问题,灯光有时会重新亮起并保持不变,有时它会重新亮起然后很快再次关闭。经过一番摆弄后,我发现暂停线程解决了这个问题:

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