Я пытаюсь написать приложение, которое требует, чтобы светодиодная вспышка включалась в режим факела. Проблема в том, что Android 2.1 не поддерживает этот режим, и поэтому я пока не могу поддерживать платформу. Не будет проблемой, но я пишу это для своего жениха, и ее Epic 4G имеет только 2.1. Я нашел несколько примеров кода, которые используют некоторые недокументированные вызовы API и, следовательно, работают на Motorola Droid и т.д., Но они не работают над Epic. У кого-нибудь есть предложения относительно того, где искать код, который должен помочь мне заставить это работать?
Camera.Parameters.FLASH_MODE_TORCH для Android 2.1
Ответ 1
Я нахожу, что режим факела, как правило, работает нормально на 2.1, но у меня была такая же проблема с Samsung Epic и нашла взломать его.
Глядя на параметры, возвращаемые Camera.getParameters() при запуске на Samsung Epic, я заметил, что флеш-режимы, которые, по его утверждению, поддерживают: flash-mode-values = off, on, auto;
факел-режим не указан, подразумевая, что он не поддерживается.
Однако я обнаружил, что эта модель все равно согласится с этим режимом и включит светодиод! Плохая новость заключалась в том, что при более позднем включении режима вспышки в автоматическом или выключенном состоянии светодиод все еще горит! Он не будет отключен, пока вы не вызовете Camera.release().
Я думаю, почему Samsung не включил его в список поддерживаемых!?!
Итак... метод, который я использую для переключения факела в классе 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());
}
}
Действия, которые используют это, называют это следующим образом:
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().... и затем я должен повторно инициализировать все свои камеры для устройств Samsung.
Не очень, но, похоже, работает для большого количества пользователей.
Обратите внимание, что у меня есть отчет о режиме факела, который не работает вообще с этим кодом на Nexus one, но ему удалось его вникнуть. Это определенно работает на HTC EVO и Samsung Epic.
Надеюсь, что это поможет.
Ответ 2
В моем случае для устройств Samsung мне нужно было установить режим фокусировки на бесконечность, и он начал работать
params.setFocusMode(Camera.Parameters.FOCUS_MODE_INFINITY);
mCamera.setParameters(params);
mCamera.startPreview();