Я хочу включить переднюю вспышку (не с предварительным просмотром камеры) программно в Android. Я погуглил, но помощь, которую я нашел, отсылала меня на эту страницу
У кого-нибудь есть ссылки или пример кода?
Я хочу включить переднюю вспышку (не с предварительным просмотром камеры) программно в Android. Я погуглил, но помощь, которую я нашел, отсылала меня на эту страницу
У кого-нибудь есть ссылки или пример кода?
Для этой проблемы вы должны:
Проверьте, является ли фонарик доступно или нет?
Если это так, то выключите/включите
Если нет, то вы можете делать что угодно, в соответствии с вашим приложением потребности.
Для проверки наличия флэш-памяти на устройстве:
Вы можете использовать следующее:
context.getPackageManager().hasSystemFeature(PackageManager.FEATURE_CAMERA_FLASH);
который вернет true, если вспышка доступна, и false, если нет.
Смотрите:
http://developer.android.com/reference/android/content/pm/PackageManager.html для получения дополнительной информации.
Для включения/выключения фонарика:
Я погуглил и получил это об android.permission.FLASHLIGHT. Разрешение манифестов 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" />
Затем используйте 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 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;
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 с помощью простых трех шагов.
<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 → Теперь перейдите в область Dim light и Snap photo, вы должны получить автоматическую вспышку, если устройство поддерживает.
Android Lollipop представил API камеры2 и устарел предыдущий API камеры. Однако использование устаревшего API для включения Flash все еще работает и намного проще, чем использование нового API.
Кажется, что новый API предназначен для использования в специализированных полнофункциональных приложениях для камер и что его архитекторы действительно не рассматривают более простые варианты использования, такие как включение фонарика. Чтобы сделать это сейчас, нужно получить CameraManager, создать CaptureSession с манекеном Surface и, наконец, создать и запустить 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;
}
}
}
Существуют разные способы доступа к Camera Flash в разных версиях Android. Немногие API перестали работать в Lollipop, а затем он снова изменился в Marshmallow. Чтобы преодолеть это, я создал простую библиотеку, которую я использовал в нескольких своих проектах, и она дает хорошие результаты. Это все еще не полностью, но вы можете попробовать проверить код и найти недостающие фрагменты. Вот ссылка - NoobCameraFlash.
Если вы просто хотите интегрироваться в ваш код, вы можете использовать для этого gradle. Здесь инструкции (взяты непосредственно из Readme) -
Шаг 1. Добавьте репозиторий JitPack в ваш файл сборки. Добавьте его в свой корневой build.gradle в конце репозитория:
allprojects {
repositories {
...
maven { url "https://jitpack.io" }
}
}
Шаг 2. Добавьте зависимость
dependencies {
compile 'com.github.Abhi347:NoobCameraFlash:0.0.1'
}
UsageИнициализируйте синглтон NoobCameraManager
.
NoobCameraManager.getInstance().init(this);
При желании вы можете установить уровень ведения журнала для отладки. В журнале используется библиотека LumberJack. LogLevel по умолчанию - LogLevel.None
NoobCameraManager.getInstance().init(this, LogLevel.Verbose);
После этого вам просто нужно позвонить в одиночную камеру, чтобы включить или выключить вспышку камеры.
NoobCameraManager.getInstance().turnOnFlash();
NoobCameraManager.getInstance().turnOffFlash();
Вы должны заботиться о разрешениях во время выполнения для доступа к камере перед инициализацией NoobCameraManager. В версии 0.1.2 или раньше мы использовали для поддержки разрешений непосредственно из библиотека, но из-за зависимости от объекта Activity, мы должны удали это.
Легко переключать Flash тоже
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);
Когда я обновил версию SDK, вспышка камеры перестает работать с исключением нулевого указателя. Я обнаружил, что мне пришлось установить targetSDKVersion в 22 в build.gradle. Когда я попытался запустить приложение 23.
targetSdkVersion 22
Вы также можете использовать следующий код для выключения вспышки.
Camera.Parameters params = mCamera.getParameters()
p.setFlashMode(Parameters.FLASH_MODE_OFF);
mCamera.setParameters(params);