【问题标题】:Android: Keep camera-LED on after screen turns offAndroid:屏幕关闭后保持相机 LED 亮起
【发布时间】:2011-11-08 18:57:18
【问题描述】:

因为我刚开始使用 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

【问题讨论】:

    标签: android camera wakelock led flashlight


    【解决方案1】:

    我找到了解决问题的方法。 当手机关闭屏幕时,它会关闭摄像头 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. 我没有在 OnStop() 方法体中释放 Camera 类实例,因为 Camera 类 release() 是罪魁祸首在关闭 LED。 2.在activity类的onPause()方法中使用LED重新激活逻辑。
    【解决方案2】:

    我不知道 HTC 是否属于这个阵营,但有几款设备(尤其是 Moto Droid)在屏幕关闭时无法使用摄像头——它们很有帮助地假设您永远不想以这种方式使用手机。如果屏幕锁定,使用相机的应用程序将进入后台并停止运行。

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

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

    【讨论】:

      【解决方案3】:

      我做了一些类似于 stefanjunkers 的操作,但在让它工作时遇到问题,灯有时会重新亮起并一直亮着,有时又重新亮起然后又很快又熄灭了。经过一番摆弄,我发现暂停线程一会儿解决了它:

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2014-10-19
        • 2020-05-16
        • 1970-01-01
        • 2011-10-22
        相关资源
        最近更新 更多