我正在尝试编写一个应用程序,要求LED闪光灯进入火炬模式。问题是,android 2.1不支持这种模式,因此我还不能支持这个平台。这不是问题,但我是为我的未婚夫写的,她史诗般的4G现在只有2.1。我发现了一些代码示例,它们使用了一些未经记录的api调用,因此可以在motorola droid等上工作,但它们不能在epic上工作。有没有人对在哪里查找代码有什么建议,可以帮助我完成这项工作?

最佳答案

我发现Torch模式在2.1上运行正常,但我对三星Epic也有同样的问题,并发现了一个漏洞。
在三星Epic上运行时,查看camera.getparameters()返回的参数,我注意到它声称支持的flash模式有:flash mode values=off、on、auto;
火炬模式未列出,这意味着它不受支持。
不过,我发现这种模式仍然可以接受这种模式,并会打开LED!坏消息是,当稍后将闪光模式设置回自动或关闭时,LED仍然亮着!在调用camera.release()之前它不会关闭。
我想这就是为什么三星不把它列入支持列表的原因吧!?!
所以…我在camerahelper类中用来切换torch的方法是…

/***
 * 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());
    }
}

使用这个的活动称之为如下…
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()…..,然后我必须为三星设备重新初始化所有相机内容。
虽然不漂亮,但似乎对很多用户都有用。
请注意,我确实有一个报告,火炬模式根本不工作与NexusOne上的代码,但已经能够挖掘它。它绝对适用于HTC EVO和三星Epic。
希望这有帮助。

09-25 21:47