Как включить переднюю вспышку программно в Android?
Я хочу включить переднюю вспышку света (не с камеры предварительного просмотра) программно в Android. Я погуглил для него, но помощь, которую я нашел, сослался на меня этой страница
есть ли у кого-нибудь ссылки или пример кода?
11 ответов:
для этой проблемы вы должны:
проверьте, является ли фонарик доступно или нет?
если да, то выключите / включите
если нет, то вы можете делать все, что угодно, в соответствии с вашим приложением по необходимости.
на Проверка наличия flash устройство:
вы можете использовать следующие:
context.getPackageManager().hasSystemFeature(PackageManager.FEATURE_CAMERA_FLASH);
который вернет true, если вспышка доступна, false, если нет.
See:
http://developer.android.com/reference/android/content/pm/PackageManager.html для получения дополнительной информации.для включения/выключения фонарика:
я погуглил и получил это об Android.разрешение.ПРОЖЕКТОР. Разрешение Android манифестов выглядит многообещающим:
<!-- Allows access to the flashlight --> <permission android:name="android.permission.FLASHLIGHT" android:permissionGroup="android.permission-group.HARDWARE_CONTROLS" android:protectionLevel="normal" android:label="@string/permlab_flashlight" android:description="@string/permdesc_flashlight" />
затем использовать камера и set камера.Параметры. Основной параметр, используемый здесь это 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
Другой Код С Открытым Исходным Кодом : 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 (виджет для включения / выключения камеры led)
если вы хотите разработать виджет, который включает / выключает светодиод вашей камеры, то вы должны сослаться на мой ответ виджет для включения/выключения камеры фонарик на Андроид..
обновление 4
если вы хотите установить интенсивность света, выходящего из камеры LED вы можете обратиться могу ли я изменить интенсивность светодиода устройства Android? полный пост. Обратите внимание, что только корневые устройства HTC поддерживают эту функцию.
** вопросы:**
есть также некоторые проблемы при включении / выключении фонарика. например. для устройств, не имеющих
FLASH_MODE_TORCH
или даже если он есть, то фонарик не включается и т. д.обычно Samsung создает много проблем.
вы можете обратиться к проблемам в приведенном ниже списке:
используйте фонарик камеры в Android
включите / выключите светодиод камеры / вспышку в Samsung Galaxy Ace 2.2.1 & Galaxy Tab
по моему опыту, если ваше приложение предназначено для работы как в портретной, так и в альбомной ориентации, вам нужно объявить переменную
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(); } } }
чтобы проявить я должен был поставить эту строку
<uses-permission android:name="android.permission.CAMERA" />
от http://developer.android.com/reference/android/hardware/Camera.html
предложенные выше строки не работали для меня.
в 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);
И Разрешения
<uses-permission android:name="android.permission.CAMERA"/> <uses-permission android:name="android.permission.FLASHLIGHT"/>
ДОПОЛНИТЕЛЬНОЕ РЕДАКТИРОВАНИЕ
люди все еще поддерживают мой ответ, поэтому я решил опубликовать дополнительный код Это было мое решение проблемы еще в тот день:
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(); } } }
Я получил AutoFlash свет с ниже простых трех шагов.
- Я только что добавил разрешение камеры и вспышки в Манифест.xml file
<uses-permission android:name="android.permission.CAMERA" /> <uses-feature android:name="android.hardware.camera" /> <uses-permission android:name="android.permission.FLASHLIGHT"/> <uses-feature android:name="android.hardware.camera.flash" android:required="false" />
в коде камеры сделайте так.
//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<String> 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 - > Теперь перейдите в область тусклого света и сфотографируйте, вы должны получить автоматическую вспышку, если устройство поддерживает.
Android Lollipop представил camera2 API и устарел предыдущий API камеры. Однако использование устаревшего API для включения flash по-прежнему работает и намного проще, чем использование нового API.
похоже, что новый API предназначен для использования в специализированных полнофункциональных приложениях для камер и что его архитекторы на самом деле не рассматривали более простые случаи использования, такие как включение фонарика. Чтобы сделать это сейчас, нужно получить CameraManager, создать CaptureSession с a фиктивная поверхность, и, наконец, создать и запустить CaptureRequest. Обработка исключений, очистка ресурсов и длинные обратные вызовы включены!
чтобы увидеть, как включить фонарик на Lollipop и новее, взгляните на FlashlightController в проекте AOSP (попробуйте найти самые новые как старые API использования, которые были изменены). Не забудьте установить необходимые разрешения.
Android Marshmallow наконец-то представил простой способ включения вспышка с setTorchMode.
полный код для Android фонарик приложение
Манифест
<?xml version="1.0" encoding="utf-8"?> <manifest xmlns:android="http://schemas.android.com/apk/res/android" package="com.user.flashlight" android:versionCode="1" android:versionName="1.0"> <uses-sdk android:minSdkVersion="8" android:targetSdkVersion="17"/> <uses-permission android:name="android.permission.CAMERA" /> <uses-feature android:name="android.hardware.camera"/> <application android:allowBackup="true" android:icon="@mipmap/ic_launcher" android:label="@string/app_name" android:theme="@style/AppTheme" > <activity android:name=".MainActivity" android:label="@string/app_name" > <intent-filter> <action android:name="android.intent.action.MAIN" /> <category android:name="android.intent.category.LAUNCHER" /> </intent-filter> </activity> </application> </manifest>
XML
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" android:layout_height="match_parent" android:paddingLeft="@dimen/activity_horizontal_margin" android:paddingRight="@dimen/activity_horizontal_margin" android:paddingTop="@dimen/activity_vertical_margin" android:paddingBottom="@dimen/activity_vertical_margin" tools:context=".MainActivity"> <Button android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="OFF" android:id="@+id/button" android:layout_centerVertical="true" android:layout_centerHorizontal="true" android:onClick="turnFlashOnOrOff" /> </RelativeLayout>
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; } } }
есть разные способы доступа к вспышке камеры в разных версиях Android. Несколько API перестали работать в Lollipop, а затем он снова изменился в Marshmallow. Чтобы преодолеть это, я создал простую библиотеку, которую я использовал в нескольких своих проектах, и это дает хорошие результаты. Он все еще неполный, но вы можете попробовать проверить код и найти недостающие части. Вот ссылка - NoobCameraFlash.
если вы просто хотите интегрировать в ваш код, вы можно использовать gradle для этого. Вот инструкции (взятые непосредственно из Readme) -
Шаг 1. Добавьте репозиторий JitPack в файл сборки. Добавьте его в корневую сборку.gradle в конце репозиториев:
allprojects { repositories { ... maven { url "https://jitpack.io" } } }
Шаг 2. Добавьте зависимость
dependencies { compile 'com.github.Abhi347:NoobCameraFlash:0.0.1' }
использование
инициализации
NoobCameraManager
синглтон.NoobCameraManager.getInstance().init(this);
вы можете дополнительно установить уровень журнала для ведения журнала отладки. Ведение журнала использует Дровосек библиотека. Уровень журнала по умолчанию -
LogLevel.None
NoobCameraManager.getInstance().init(this, LogLevel.Verbose);
после этого вам просто нужно вызвать синглтон, чтобы включить или выключить вспышку камеры.
NoobCameraManager.getInstance().turnOnFlash(); NoobCameraManager.getInstance().turnOffFlash();
вы должны заботиться о разрешениях времени выполнения для доступа к камере самостоятельно, перед инициализацией NoobCameraManager. В версии 0.1.2 или раньше мы использовали для поддержки разрешений непосредственно из библиотека, но из-за зависимости от объекта Activity, мы должны удалять оно.
легко переключать вспышку тоже
if(NoobCameraManager.getInstance().isFlashOn()){ NoobCameraManager.getInstance().turnOffFlash(); }else{ NoobCameraManager.getInstance().turnOnFlash(); }
я реализовал эту функцию в своем приложении через фрагменты с помощью SurfaceView. Ссылка на этот вопрос stackoverflow и его ответ можно найти здесь
надеюсь, что это помогает :)
в Marshmallow и выше, CameraManager `setTorchMode ()', кажется, ответ. Это работает для меня:
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);