Android 2.1 的 Camera.Parameters.FLASH_MODE_TORCH 替代品

Posted

技术标签:

【中文标题】Android 2.1 的 Camera.Parameters.FLASH_MODE_TORCH 替代品【英文标题】:Camera.Parameters.FLASH_MODE_TORCH replacement for Android 2.1 【发布时间】:2011-04-22 03:41:47 【问题描述】:

我正在尝试编写一个需要 LED 闪光灯进入手电筒模式的应用程序。问题是,android 2.1 不支持这种模式,所以我还不能支持这个平台。这不是问题,但我是为我的未婚夫写的,她的 Epic 4G 现在只有 2.1。我发现一些代码示例使用了一些未记录的 API 调用,因此可以在 Motorola Droid 等设备上运行,但它们不适用于 Epic。有没有人对在哪里寻找可以帮助我完成这项工作的代码有一些建议?

【问题讨论】:

【参考方案1】:

我发现手电筒模式在 2.1 上通常可以正常工作,但我在三星 Epic 上遇到了同样的问题,并发现了一个 hack。

查看在 Samsung Epic 上运行时 Camera.getParameters() 返回的参数,我注意到它声称支持的 flash-modes 是:flash-mode-values=off,on,auto;

torch-mode 未列出,表示不支持。

但是,我发现这个模型仍然可以接受该模式并且会打开 LED!坏消息是,当稍后将闪光灯模式设置回自动或关闭时,LED 仍然亮着!在您调用 Camera.release() 之前它不会关闭。

我猜这就是为什么三星不将它列入支持列表的原因!?!

所以...我在 CameraHelper 类中用来切换手电筒的方法是...

/***
 * Attempts to set camera flash torch/flashlight mode on/off
 * @param isOn true = on, false = off
 * @return boolean whether or not we were able to set it
 */
public boolean setFlashlight(boolean isOn)

    if (mCamera == null)
    
        return false;
    
    Camera.Parameters params = mCamera.getParameters();
    String value;
    if (isOn) // we are being ask to turn it on
    
        value = Camera.Parameters.FLASH_MODE_TORCH;
    
    else  // we are being asked to turn it off
    
        value =  Camera.Parameters.FLASH_MODE_AUTO;
    

    try    
        params.setFlashMode(value);
        mCamera.setParameters(params);

        String nowMode = mCamera.getParameters().getFlashMode();

        if (isOn && nowMode.equals(Camera.Parameters.FLASH_MODE_TORCH))
        
            return true;
        
        if (! isOn && nowMode.equals(Camera.Parameters.FLASH_MODE_AUTO))
        
            return true;
        
        return false;
    
    catch (Exception ex)
    
        MyLog.e(mLOG_TAG, this.getClass().getSimpleName() +  " error setting flash mode to: "+ value + " " + ex.toString());
    

使用这个的activity调用它如下...

private void toggleFlashLight()

    mIsFlashlightOn = ! mIsFlashlightOn;

    /**
     * hack to fix an issue where the Samsung Galaxy will turn torch on,
     * even though it says it doesnt support torch mode,
     * but then will NOT turn it off via this param.
     */
    if (! mIsFlashlightOn && Build.MANUFACTURER.equalsIgnoreCase("Samsung"))
    
        this.releaseCameraResources();
        this.initCamera();
    
    else
    
        boolean result = mCamHelper.setFlashlight(mIsFlashlightOn);
        if (! result)
        
            alertFlashlightNotSupported();
        
    

在 releaseCameraResources() 中进行这项工作的神奇之处在于它调用 Camera.release()....然后我必须为三星设备重新初始化所有相机。

不漂亮,但似乎适用于很多用户。

请注意,我确实有一份报告称,火炬模式在 Nexus one 上根本无法使用此代码,但能够深入研究它。它绝对适用于 HTC EVO 和三星 Epic。

希望这会有所帮助。

【讨论】:

不确定我是不是做错了什么,但是当我尝试调试它时,我得到了强制关闭。 没有冒犯,但基于手机制造商的功能并不是理想的选择。谁知道三星手机在半年或更长时间后会具备哪些功能? 我使用了你的代码。但是相机手电筒会在几秒钟后自动关闭。我在 samsung galaxy ace 2.2.1 中测试了代码。这可能是什么原因? 您是否可以找到适用于该手机的手电筒应用程序?如果不是,我怀疑是硬件中的某些东西在某个时候将其关闭。 我是 Cool Flashlight 的开发人员,我可以确认此代码也适用于 Galaxy 2、ideios X5 和 htc 的愿望。【参考方案2】:

对于三星设备,我需要将对焦模式设置为无限远,它开始工作

params.setFocusMode(Camera.Parameters.FOCUS_MODE_INFINITY);
mCamera.setParameters(params);
mCamera.startPreview();

【讨论】:

非常感谢您的提示 :) 我遇到了闪光灯无法在对焦模式为“自动”的 Galaxy S 5 上工作的问题,将其设置为“无限”就可以了:p

以上是关于Android 2.1 的 Camera.Parameters.FLASH_MODE_TORCH 替代品的主要内容,如果未能解决你的问题,请参考以下文章

了解在 Android 1.6/2.0/2.1 上使用 SoundPool 加载声音是不是成功

GCM 会在 2.1 中崩溃 Android 应用程序吗?

另一个线程中的 Android 视频视图 & android 2.1 的问题

Google停止在Android 2.1和更低版本中支持Android市场

Android 2.1 和 2.2 之间的 SQLite 差异

未找到 Android API 24 平台的源 (Android Studio 2.1)