Как включить фронтальную вспышку программно в Android?

Я хочу включить фронтальную вспышку (не с предварительным просмотром камеры) программно в Android. Я googled для этого, но помощь, которую я нашел, связала меня с этой страницей

У кого-нибудь есть ссылки или пример кода?

Для этой проблемы вы должны:

  1. Проверьте, доступен ли фонарик или нет?

  2. Если это так, выключите / вкл.

  3. Если нет, то вы можете делать все, что вам нужно.

Для проверки наличия вспышки в устройстве:

Вы можете использовать следующее:

context.getPackageManager().hasSystemFeature(PackageManager.FEATURE_CAMERA_FLASH); 

который вернет true, если доступна вспышка, false, если нет.

Видеть:
http://developer.android.com/reference/android/content/pm/PackageManager.html для получения дополнительной информации.

Для включения / выключения фонарика:

Я googled и получил это о android.permission.FLASHLIGHT. Разрешение Android-манифеста выглядит многообещающим:

    

Затем используйте Camera и установите Camera.Parameters . Основной параметр, используемый здесь, – FLASH_MODE_TORCH .

например.

Фрагмент кода, чтобы включить фонарь камеры.

 Camera cam = Camera.open(); Parameters p = cam.getParameters(); p.setFlashMode(Parameters.FLASH_MODE_TORCH); cam.setParameters(p); cam.startPreview(); 

Фрагмент кода для отключения подсветки камеры.

  cam.stopPreview(); cam.release(); 

Я просто нашел проект, который использует это разрешение. Проверьте код src быстрой настройки. здесь http://code.google.com/p/quick-settings/ (Примечание: эта ссылка сейчас не работает)

Для фонарика прямо посмотрите http://code.google.com/p/quick-settings/source/browse/trunk/quick-settings/#quick-settings/src/com/bwx/bequick/flashlight (Примечание: эта ссылка есть теперь сломан)

Update6 Вы также можете попытаться добавить SurfaceView, как описано в этом ответе на светодиодный фонарик Galaxy Nexus, управляемый каким API? Это похоже на решение, которое работает на многих телефонах.

Обновление 5 основных обновлений

Я нашел альтернативную ссылку (для неработающих ссылок выше): http://www.java2s.com/Open-Source/Android/Tools/quick-settings/com.bwx.bequick.flashlight.htm Теперь вы можете использовать эту ссылка. [Обновить: 14/9/2012 Эта ссылка сейчас не работает]

Обновление 1

Другой код OpenSource: http://code.google.com/p/torch/source/browse/

Обновление 2

Пример, показывающий, как включить светодиод на Motorola Droid: http://code.google.com/p/droidled/

Другой код с открытым исходным кодом:

http://code.google.com/p/covedesigndev/
http://code.google.com/p/search-light/

Обновление 3 (Виджет для включения / выключения камеры)

Если вы хотите разработать виджет, который включает / выключает вашу камеру, то вы должны указать мой ответ Виджет для включения / выключения фонаря камеры в android ..

Обновление 4

Если вы хотите установить интенсивность света, выходящего из светодиода камеры, вы можете сослаться. Могу ли я изменить интенсивность светодиодов на устройстве Android? полный пост. Обратите внимание, что поддерживаются только укороченные устройства HTC.

** Вопросы:**

Также возникают проблемы при включении / выключении фонарика. например. для устройств, не имеющих FLASH_MODE_TORCH или даже если они есть, тогда фонарик не включается и т. д.

Как правило, Samsung создает множество проблем.

Вы можете обратиться к проблемам в приведенном ниже списке:

Использовать фонарик камеры в Android

Включите / выключите светодиодный индикатор камеры / вспышку в Samsung Galaxy Ace 2.2.1 и вкладке Galaxy

По моему опыту, если ваше приложение предназначено для работы как в портретной, так и в альбомной ориентации, вам нужно объявить переменную cam статичной. В противном случае onDestroy() , который вызывается при переключении ориентации, уничтожает его, но не освобождает камеру, поэтому повторное открытие невозможно.

 package com.example.flashlight; import android.hardware.Camera; import android.hardware.Camera.Parameters; import android.os.Bundle; import android.app.Activity; import android.content.pm.PackageManager; import android.view.Menu; import android.view.View; import android.widget.Toast; public class MainActivity extends Activity { public static Camera cam = null;// has to be static, otherwise onDestroy() destroys it @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); } @Override public boolean onCreateOptionsMenu(Menu menu) { // Inflate the menu; this adds items to the action bar if it is present. getMenuInflater().inflate(R.menu.activity_main, menu); return true; } public void flashLightOn(View view) { try { if (getPackageManager().hasSystemFeature( PackageManager.FEATURE_CAMERA_FLASH)) { cam = Camera.open(); Parameters p = cam.getParameters(); p.setFlashMode(Parameters.FLASH_MODE_TORCH); cam.setParameters(p); cam.startPreview(); } } catch (Exception e) { e.printStackTrace(); Toast.makeText(getBaseContext(), "Exception flashLightOn()", Toast.LENGTH_SHORT).show(); } } public void flashLightOff(View view) { try { if (getPackageManager().hasSystemFeature( PackageManager.FEATURE_CAMERA_FLASH)) { cam.stopPreview(); cam.release(); cam = null; } } catch (Exception e) { e.printStackTrace(); Toast.makeText(getBaseContext(), "Exception flashLightOff", Toast.LENGTH_SHORT).show(); } } } 

я должен был показать эту строку

   

от http://developer.android.com/reference/android/hardware/Camera.html

предложенные выше строки не работали для меня.

Я получил подсветку AutoFlash с помощью простых трех шагов.

  • Я просто добавил разрешение камеры и Flash в файл Manifest.xml
     
  • В коде камеры выполните этот способ.

     //Open Camera Camera mCamera = Camera.open(); //Get Camera Params for customisation Camera.Parameters parameters = mCamera.getParameters(); //Check Whether device supports AutoFlash, If you YES then set AutoFlash List flashModes = parameters.getSupportedFlashModes(); if (flashModes.contains(android.hardware.Camera.Parameters.FLASH_MODE_AUTO)) { parameters.setFlashMode(Parameters.FLASH_MODE_AUTO); } mCamera.setParameters(parameters); mCamera.startPreview(); 
  • Build + Run -> Теперь перейдите в область «Тусклый свет» и «Снимок», вы должны получить автоматическую вспышку, если устройство поддерживает.

В API 23 или выше (Android M, 6.0)

Включить код

 if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) { CameraManager camManager = (CameraManager) getSystemService(Context.CAMERA_SERVICE); String cameraId = null; // Usually back camera is at 0 position. try { cameraId = camManager.getCameraIdList()[0]; camManager.setTorchMode(cameraId, true); //Turn ON } catch (CameraAccessException e) { e.printStackTrace(); } } 

Выключить код

 camManager.setTorchMode(cameraId, false); 

И разрешения

   

ДОПОЛНИТЕЛЬНОЕ ИЗОБРАЖЕНИЕ

Люди все еще поддерживают мой ответ, поэтому я решил опубликовать дополнительный код. Это было мое решение проблемы в тот же день:

 public class FlashlightProvider { private static final String TAG = FlashlightProvider.class.getSimpleName(); private Camera mCamera; private Camera.Parameters parameters; private CameraManager camManager; private Context context; public FlashlightProvider(Context context) { this.context = context; } private void turnFlashlightOn() { if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) { try { camManager = (CameraManager) context.getSystemService(Context.CAMERA_SERVICE); String cameraId = null; // Usually front camera is at 0 position. if (camManager != null) { cameraId = camManager.getCameraIdList()[0]; camManager.setTorchMode(cameraId, true); } } catch (CameraAccessException e) { Log.e(TAG, e.toString()); } } else { mCamera = Camera.open(); parameters = mCamera.getParameters(); parameters.setFlashMode(Camera.Parameters.FLASH_MODE_TORCH); mCamera.setParameters(parameters); mCamera.startPreview(); } } private void turnFlashlightOff() { if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) { try { String cameraId; camManager = (CameraManager) context.getSystemService(Context.CAMERA_SERVICE); if (camManager != null) { cameraId = camManager.getCameraIdList()[0]; // Usually front camera is at 0 position. camManager.setTorchMode(cameraId, false); } } catch (CameraAccessException e) { e.printStackTrace(); } } else { mCamera = Camera.open(); parameters = mCamera.getParameters(); parameters.setFlashMode(Camera.Parameters.FLASH_MODE_OFF); mCamera.setParameters(parameters); mCamera.stopPreview(); } } } 

Android Lollipop представил API камеры2 и устарел предыдущий API камеры. Однако использование устаревшего API для включения Flash все еще работает и намного проще, чем использование нового API.

Кажется, что новый API предназначен для использования в специальных полнофункциональных приложениях для камер и что его архитекторы действительно не рассматривают более простые варианты использования, такие как включение фонарика. Чтобы сделать это сейчас, нужно получить CameraManager, создать CaptureSession с манекеном Surface и, наконец, создать и запустить CaptureRequest. Обработка исключений, очистка ресурсов и длинные обратные вызовы включены!

Чтобы посмотреть, как включить фонарик на Lollipop и новее, взгляните на FlashlightController в проекте AOSP (попробуйте найти новейшие, как старые API использования, которые были изменены). Не забудьте установить необходимые разрешения.


Android Marshmallow, наконец, представила простой способ включения вспышки с помощью setTorchMode .

Полный код для Android-флеш-накопителя

манифест

                ?                

XML

    

MainActivity.java

  import android.app.AlertDialog; import android.content.DialogInterface; import android.content.pm.PackageManager; import android.hardware.Camera; import android.hardware.Camera.Parameters; import android.support.v7.app.AppCompatActivity; import android.os.Bundle; import android.view.View; import android.widget.Button; import java.security.Policy; public class MainActivity extends AppCompatActivity { Button button; private Camera camera; private boolean isFlashOn; private boolean hasFlash; Parameters params; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); button = (Button) findViewById(R.id.button); hasFlash = getApplicationContext().getPackageManager().hasSystemFeature(PackageManager.FEATURE_CAMERA_FLASH); if(!hasFlash) { AlertDialog alert = new AlertDialog.Builder(MainActivity.this).create(); alert.setTitle("Error"); alert.setMessage("Sorry, your device doesn't support flash light!"); alert.setButton("OK", new DialogInterface.OnClickListener() { @Override public void onClick(DialogInterface dialog, int which) { finish(); } }); alert.show(); return; } getCamera(); button.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { if (isFlashOn) { turnOffFlash(); button.setText("ON"); } else { turnOnFlash(); button.setText("OFF"); } } }); } private void getCamera() { if (camera == null) { try { camera = Camera.open(); params = camera.getParameters(); }catch (Exception e) { } } } private void turnOnFlash() { if(!isFlashOn) { if(camera == null || params == null) { return; } params = camera.getParameters(); params.setFlashMode(Parameters.FLASH_MODE_TORCH); camera.setParameters(params); camera.startPreview(); isFlashOn = true; } } private void turnOffFlash() { if (isFlashOn) { if (camera == null || params == null) { return; } params = camera.getParameters(); params.setFlashMode(Parameters.FLASH_MODE_OFF); camera.setParameters(params); camera.stopPreview(); isFlashOn = false; } } @Override protected void onDestroy() { super.onDestroy(); } @Override protected void onPause() { super.onPause(); // on pause turn off the flash turnOffFlash(); } @Override protected void onRestart() { super.onRestart(); } @Override protected void onResume() { super.onResume(); // on resume turn on the flash if(hasFlash) turnOnFlash(); } @Override protected void onStart() { super.onStart(); // on starting the app get the camera params getCamera(); } @Override protected void onStop() { super.onStop(); // on stop release the camera if (camera != null) { camera.release(); camera = null; } } } 

Существуют различные способы доступа к Camera Flash в разных версиях Android. Немногие API перестали работать на Lollipop, а затем снова были изменены в Marshmallow. Чтобы преодолеть это, я создал простую библиотеку, которую я использовал в немногих моих проектах, и это дает хорошие результаты. Он по-прежнему неполный, но вы можете попробовать проверить код и найти недостающие fragmentы. Вот ссылка – NoobCameraFlash .

Если вы просто хотите интегрировать в свой код, для этого вы можете использовать gradle. Вот инструкции (взяты непосредственно из Readme) –

Шаг 1. Добавьте repository JitPack в файл сборки. Добавьте его в свой root build.gradle в конце репозиториев:

 allprojects { repositories { ... maven { url "https://jitpack.io" } } } 

Шаг 2. Добавьте зависимость

 dependencies { compile 'com.github.Abhi347:NoobCameraFlash:0.0.1' } 

Применение

Инициализируйте NoobCameraManager .

 NoobCameraManager.getInstance().init(this); 

Вы можете дополнительно установить Log Log для ведения журнала отладки. В журнале используется библиотека LumberJack . По умолчанию LogLevel – LogLevel.None

 NoobCameraManager.getInstance().init(this, LogLevel.Verbose); 

После этого вам просто нужно вызвать синглтон, чтобы включить или выключить вспышку камеры.

 NoobCameraManager.getInstance().turnOnFlash(); NoobCameraManager.getInstance().turnOffFlash(); 

Перед инициализацией NoobCameraManager вы должны позаботиться о разрешениях времени выполнения для доступа к Camera самостоятельно. В версии 0.1.2 или ранее мы использовали поддержку разрешений непосредственно из библиотеки, но из-за зависимости от объекта Activity мы должны удалить ее.

Легко также переключать Flash

 if(NoobCameraManager.getInstance().isFlashOn()){ NoobCameraManager.getInstance().turnOffFlash(); }else{ NoobCameraManager.getInstance().turnOnFlash(); } 

Я реализовал эту функцию в своем приложении через fragmentы, используя SurfaceView. Ссылка на этот вопрос stackoverflow и его ответ можно найти здесь

Надеюсь это поможет 🙂

В Marshmallow и выше, «setTorchMode () CameraManager, кажется, является ответом. Это работает для меня:

  final CameraManager mCameraManager = (CameraManager) getSystemService(Context.CAMERA_SERVICE); CameraManager.TorchCallback torchCallback = new CameraManager.TorchCallback() { @Override public void onTorchModeUnavailable(String cameraId) { super.onTorchModeUnavailable(cameraId); } @Override public void onTorchModeChanged(String cameraId, boolean enabled) { super.onTorchModeChanged(cameraId, enabled); boolean currentTorchState = enabled; try { mCameraManager.setTorchMode(cameraId, !currentTorchState); } catch (CameraAccessException e){} } }; mCameraManager.registerTorchCallback(torchCallback, null);//fires onTorchModeChanged upon register mCameraManager.unregisterTorchCallback(torchCallback); 

Когда я обновил версию SDK, вспышка камеры перестает работать с исключением нулевого указателя. Я обнаружил, что мне пришлось установить targetSDKVersion в 22 в build.gradle. Когда я попытался 23, приложение разбилось.

  targetSdkVersion 22 

Вы также можете использовать следующий код для выключения вспышки.

 Camera.Parameters params = mCamera.getParameters() p.setFlashMode(Parameters.FLASH_MODE_OFF); mCamera.setParameters(params); 
  • Камера Android вращается
  • Как сохранить фотографию в библиотеке фотографий iPhone?
  • Моя камера Android Uri возвращает нулевое значение, но исправление Samsung на месте, помощь?
  • Android: наложение на просмотр камеры Android
  • Разрешение отказа: запрещено отправлять трансляцию в android
  • Как открыть «переднюю камеру» на платформе Android?
  • Преобразование YUV в RGB с помощью fragmentарного шейдера
  • Можно ли использовать переднюю и заднюю камеры одновременно в Android
  • Предварительный просмотр камеры на нескольких устройствах Android
  • Вращающийся телефон быстро на 180 gradleусов, предварительный просмотр камеры перевернут
  • переключение назад / передняя камера на лету
  • Interesting Posts

    Как узнать положение (linenumber) streamа-streamа в текстовом файле?

    Как пропустить / игнорировать / пропускать пустые литералы объектов в выпуске JSON?

    Может ли gcc вывести код C после предварительной обработки?

    В чем разница между «Class.forName ()» и «Class.forName (). NewInstance ()»?

    Конфигурация .NET (app.config / web.config / settings.settings)

    Получить путь к исполняемому каталогу приложения Windows Forms

    Использование кросс-streamов свойства «HttpContext.Current» и связанных с ним вещей

    Создайте новый экземпляр classа с зависимостями, не понимая поставщика фабрики

    Поддерживает ли Dapper поддержку табличных значений SQL 2008?

    Мульти-хост SSH-соединение

    Установка Tiger на Snow Leopard MacBook

    Наименее разрушительный антивирус во время работы

    Данные в реальном времени в сетке – лучший метод

    Лучший способ чтения большого файла в массив байтов в C #?

    Для запуска dex в процессе, демону Gradle нужна большая куча. В настоящее время он имеет приблизительно 910 МБ

    Давайте будем гением компьютера.