Используйте вспышку камеры в Android
Я пытаюсь использовать камеры светодиодный фонарик в виджете. Я нашел несколько тем по этой теме (т. е. один названы позже..), теперь я пытаюсь контролировать свет с помощью:
Camera cam = Camera.open();
Parameters p = cam.getParameters();
p.setFlashMode(Parameters.FLASH_MODE_TORCH);
cam.setParameters(p);
cam.release();
в AndroidManifest.xml пробовал разные разрешения, в настоящее время у меня есть:
<uses-permission android:name="android.permission.CAMERA" />
<uses-permission android:name="android.permission.FLASHLIGHT"/>
<uses-feature android:name="android.hardware.camera" />
<uses-feature android:name="android.hardware.camera.autofocus" />
<uses-feature android:name="android.hardware.camera.flash" />
Я тестирую это на моей вкладке Galaxy, поскольку у меня нет других устройств Android под рукой: свет не включается. Так что у меня есть несколько вопросов теперь:
- есть ли способ проверить поведение светодиодного света в эмуляторе?
- Я делаю что-то не так здесь?
- по данным этой вопрос, который имеет дело с той же проблемой, он работает по-разному на вкладке Galaxy. Как?
- и, наконец, если он работает по-другому, я начинаю задаваться вопросом, является ли это просто Galaxy Tab или другие устройства тоже используют разные методы. Было бы трудно проверить тогда, и это кажется довольно странно для меня.
Спасибо за информацию!
кстати, я быстро протестировал с быстрые настройки который упоминается здесь несколько раз. Фонарик также не работает с быстрыми настройками.
обратите внимание, что Galaxy Tab stil использует android 2.2. Я вижу, что произошли некоторые изменения между 2.2 и 2.3.
комментарий: Я знаю, что это должно работать как-то, как я нашел другие приложения на рынке, которые отлично работают с галактикой Табуляция.
Комментарии 2: Если я поставлю Кэма.setParameters (p); и непосредственно попросите камеру для текущего состояния с getFlashMode () он правильно возвращает FLASH_MODE_TORCH. Однако, если я отпущу камеру и снова открою ее, она вернет FLASH_MODE_OFF. Это почти так, как если бы объект камеры знал запрос, но на самом деле не передавал его на аппаратное обеспечение!?
--
после комментария Константина, я убрал камеру.release (); part. Он прав, настроек нет сохраняется, если вы отпустите камеру. Если вы используете камеру.снова откройте (), вы получите новый экземпляр с выключенным светом. Однако свет все еще не работает на вкладке galaxy. Итак, я думаю, что трудно держать свет, если вы пытаетесь контролировать его через виджет. Как только фоновая служба завершена, объект камеры автоматически освобождается, и поэтому свет снова выключается. Мои вопросы все еще остаются, особенно почему камера не включается в первом место.
7 ответов:
каждое устройство немного отличается. Samsung особенно любит усложнять все для разработчиков приложений.
на вкладке Galaxy вы должны быть хороши с:
Camera cam; void ledon() { cam = Camera.open(); Parameters params = cam.getParameters(); params.setFlashMode(Parameters.FLASH_MODE_ON); cam.setParameters(params); cam.startPreview(); cam.autoFocus(new AutoFocusCallback() { public void onAutoFocus(boolean success, Camera camera) { } }); } void ledoff() { cam.stopPreview(); cam.release(); }
Если это не работает, то это может быть вопрос установки FLASH_MODE_OFF изначально и изменить его после startPreview.
вы не должны отпускать камеру после установки параметров. Я обнаружил, что вспышка активирована (в режиме Факела) после запуска предварительного просмотра. (Относится к motorola defy, 2.1)
Это также хорошая идея, чтобы проверить поддерживаемые режимы вспышки, прежде чем пытаться их активировать.
возиться с настройками камеры на android-это самое темное вуду: многие устройства ведут себя по-разному, и, похоже, нет надежного способа нацелить их на все с одним куском кода. Пригодный ставка заключается в том, чтобы всегда правильно настроить камеру, когда ваш onResume() метод называется. Я также хотел бы сделать то же самое в onConfigChange (), потому что по крайней мере Motorola screen locker может заставить ваше приложение в портретном режиме, перезапустив его полностью.
P. s. Я полагаю, что когда вы закрываете камеру, приложение native camera закрывается, а затем воссоздается в новом состоянии.
Я сделал это следующим образом, которая работает на многих телефонах:
String manuName = android.os.Build.MANUFACTURER.toLowerCase(); Camera mCamera;
ниже код показывает, как выключить и включить свет:
private void processOnClick() { if (manuName.contains("motorola")) { DroidLED led; try { led = new DroidLED(); led.enable(true); } catch (Exception e) { // TODO Auto-generated catch block e.printStackTrace(); } } else { if (mCamera == null) { try { mCamera = Camera.open(); } catch (Exception e) { e.printStackTrace(); } } if (mCamera != null) { final Parameters params = mCamera.getParameters(); List<String> flashModes = params.getSupportedFlashModes(); if (flashModes == null) { return; } else { if (count == 0) { params.setFlashMode(Parameters.FLASH_MODE_OFF); mCamera.setParameters(params); mCamera.startPreview(); } String flashMode = params.getFlashMode(); if (!Parameters.FLASH_MODE_TORCH.equals(flashMode)) { if (flashModes.contains(Parameters.FLASH_MODE_TORCH)) { params.setFlashMode(Parameters.FLASH_MODE_TORCH); mCamera.setParameters(params); } else { // Toast.makeText(this, // "Flash mode (torch) not supported",Toast.LENGTH_LONG).show(); params.setFlashMode(Parameters.FLASH_MODE_ON); mCamera.setParameters(params); try { mCamera.autoFocus(new AutoFocusCallback() { public void onAutoFocus(boolean success, Camera camera) { count = 1; } }); } catch (Exception e) { e.printStackTrace(); } } } } } } if (mCamera == null) { return; } } private void processOffClick() { if (manuName.contains("motorola")) { DroidLED led; try { led = new DroidLED(); led.enable(false); } catch (Exception e) { // TODO Auto-generated catch block e.printStackTrace(); } } else { if (mCamera != null) { count = 0; mCamera.stopPreview(); } } }
ниже класс DroidLED:
class DroidLED { private Object svc = null; private Method getFlashlightEnabled = null; private Method setFlashlightEnabled = null; @SuppressWarnings("unchecked") public DroidLED() throws Exception { try { // call ServiceManager.getService("hardware") to get an IBinder for the service. // this appears to be totally undocumented and not exposed in the SDK whatsoever. Class sm = Class.forName("android.os.ServiceManager"); Object hwBinder = sm.getMethod("getService", String.class).invoke(null, "hardware"); // get the hardware service stub. this seems to just get us one step closer to the proxy Class hwsstub = Class.forName("android.os.IHardwareService$Stub"); Method asInterface = hwsstub.getMethod("asInterface", android.os.IBinder.class); svc = asInterface.invoke(null, (IBinder) hwBinder); // grab the class (android.os.IHardwareService$Stub$Proxy) so we can reflect on its methods Class proxy = svc.getClass(); // save methods getFlashlightEnabled = proxy.getMethod("getFlashlightEnabled"); setFlashlightEnabled = proxy.getMethod("setFlashlightEnabled", boolean.class); } catch(Exception e) { throw new Exception("LED could not be initialized"); } } public boolean isEnabled() { try { return getFlashlightEnabled.invoke(svc).equals(true); } catch(Exception e) { return false; } } public void enable(boolean tf) { try { setFlashlightEnabled.invoke(svc, tf); } catch(Exception e) {} }
}
следующие разрешения должны быть установлены в ваш AndroidManifest.XML-код:
<uses-permission android:name="android.permission.CAMERA" /> <uses-permission android:name="android.permission.FLASHLIGHT"/> <uses-feature android:name="android.hardware.camera" /> <uses-feature android:name="android.hardware.camera.autofocus" /> <uses-feature android:name="android.hardware.camera.flash" />
это работает для меня на HTC Desire... (с 2.2) (Конечно, с камерой и фонариком разрешения):
Camera mycam = Camera.open(); Parameters p = mycam.getParameters();// = mycam.getParameters(); p.setFlashMode(Parameters.FLASH_MODE_TORCH); mycam.setParameters(p); //time passes try { Thread.sleep(500); } catch (InterruptedException e) { // TODO Auto-generated catch block e.printStackTrace(); } p.setFlashMode(Parameters.FLASH_MODE_OFF); mycam.release();
вы также можете попробовать добавить вид поверхности. Пожалуйста, взгляните на мой ответ светодиодный фонарик на Galaxy Nexus, управляемый каким API?
пожалуйста, используйте эту ссылку:
http://www.androidhive.info/2013/04/android-developing-flashlight-application/
Это очень полезно для меня.
private Camera camera; void openCam(){ camera = Camera.open(); if (camera != null) { Camera.Parameters params = camera.getParameters(); camera.setParameters(params); } Camera.Parameters p = camera.getParameters(); p.setFlashMode(Parameters.FLASH_MODE_TORCH); camera.setParameters(p); }
установить разрешение в Манифест:
<uses-permission android:name="android.permission.FLASHLIGHT" android:permissionGroup="android.permission-group.HARDWARE_CONTROLS" android:protectionLevel="normal" /> <uses-feature android:name="android.hardware.camera" /> <uses-feature android:name="android.hardware.camera.flash" />