Câu trả lời:
Đối với vấn đề này, bạn nên:
Kiểm tra xem đèn pin có sẵn hay không?
Nếu vậy thì Tắt / Bật
Nếu không thì bạn có thể làm bất cứ điều gì, theo nhu cầu ứng dụng của bạn.
Để kiểm tra tính khả dụng của đèn flash trong thiết bị:
Bạn có thể sử dụng như sau:
context.getPackageManager().hasSystemFeature(PackageManager.FEATURE_CAMERA_FLASH);
sẽ trả về true nếu flash có sẵn, false nếu không.
Xem:
http://developer.android.com/reference/android/content/pm/PackageManager.html để biết thêm thông tin.
Để bật / tắt đèn pin:
Tôi đã tìm hiểu và nhận được điều này về ERIC.FLASHLIGHT. Sự cho phép của bản kê khai Android có vẻ đầy hứa hẹn:
<!-- 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" />
Sau đó, sử dụng Camera và đặt Camera.Parameter . Tham số chính được sử dụng ở đây là FLASH_MODE_TORCH .
ví dụ.
Mã Snippet để bật đèn pin máy ảnh.
Camera cam = Camera.open();
Parameters p = cam.getParameters();
p.setFlashMode(Parameters.FLASH_MODE_TORCH);
cam.setParameters(p);
cam.startPreview();
Đoạn mã để tắt đèn led camera.
cam.stopPreview();
cam.release();
Tôi chỉ tìm thấy một dự án sử dụng sự cho phép này. Kiểm tra mã src của cài đặt nhanh. tại đây http://code.google.com.vn/p/quick-sinstall/ (Lưu ý: Liên kết này hiện đã bị hỏng)
Đối với Đèn pin, hãy trực tiếp tìm http://code.google.com.vn/p/quick-sinstall/source/browse/trunk/quick-sinstall/#quick-sinstall/src/com/bwx/bequick/flashlight (Lưu ý: Liên kết này là bây giờ bị hỏng)
Update6 Bạn cũng có thể thử thêm SurfaceView như được mô tả trong câu trả lời này Đèn pin LED trên Galaxy Nexus có thể điều khiển bằng API nào? Đây dường như là một giải pháp hoạt động trên nhiều điện thoại.
Cập nhật 5 Cập nhật chính
Tôi đã tìm thấy một Liên kết thay thế (đối với các liên kết bị hỏng ở trên): http://www.java2s.com/Open-Source/Android/Tools/quick-sinstall/com.bwx.bequick.flashlight.htmlm Bây giờ bạn có thể sử dụng liên kết. [Cập nhật: 14/9/2012 Liên kết này hiện đã bị hỏng]
Cập nhật 1
Một mã nguồn mở khác: http://code.google.com.vn/p/torch/source/browse/
Cập nhật 2
Ví dụ cho thấy cách bật đèn LED trên Motorola Droid: http://code.google.com.vn/p/droidled/
Một mã nguồn mở khác:
http://code.google.com.vn/p/covedesigndev/
http://code.google.com.vn/p/search-light/
Cập nhật 3 (Tiện ích để bật / tắt đèn led camera)
Nếu bạn muốn phát triển một tiện ích bật / tắt đèn led máy ảnh của mình, thì bạn phải tham khảo Tiện ích trả lời của tôi để bật / tắt đèn pin máy ảnh trong Android ..
Cập nhật 4
Nếu bạn muốn đặt cường độ ánh sáng phát ra từ đèn LED camera, bạn có thể tham khảo Tôi có thể thay đổi cường độ đèn LED của thiết bị Android không? bài đầy đủ. Lưu ý rằng chỉ các thiết bị HTC đã root mới hỗ trợ tính năng này.
** Vấn đề: **
Cũng có một số vấn đề trong khi bật / tắt đèn pin. ví dụ. đối với các thiết bị không có FLASH_MODE_TORCH
hoặc thậm chí nếu có, thì đèn pin không BẬT, v.v.
Điển hình là Samsung tạo ra rất nhiều vấn đề.
Bạn có thể tham khảo các vấn đề trong danh sách dưới đây:
Sử dụng đèn pin máy ảnh trong Android
BẬT / TẮT đèn LED / đèn flash của máy ảnh trong Samsung Galaxy Ace 2.2.1 & Galaxy Tab
Theo kinh nghiệm của tôi, nếu ứng dụng của bạn được thiết kế để hoạt động theo cả hướng dọc và ngang, bạn cần khai báo biến cam
là tĩnh. Mặt khác, onDestroy()
được gọi là chuyển hướng, phá hủy nó nhưng không giải phóng Camera nên không thể mở lại được.
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();
}
}
}
để biểu lộ tôi đã phải đặt dòng này
<uses-permission android:name="android.permission.CAMERA" />
từ http://developer.android.com/reference/android/hardware/Camera.html
dòng gợi ý ở trên không làm việc cho tôi.
you need to declare the variable cam as static
Camera
lớp, hãy AndroidStudio
chú ý đến android.hardware
lớp ...
Trong API 23 trở lên (Android M, 6.0)
Bật mã
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();
}
}
TẮT mã
camManager.setTorchMode(cameraId, false);
Và Quyền
<uses-permission android:name="android.permission.CAMERA"/>
<uses-permission android:name="android.permission.FLASHLIGHT"/>
EDIT BỔ SUNG
Mọi người vẫn ủng hộ câu trả lời của tôi vì vậy tôi quyết định đăng thêm mã Đây là giải pháp của tôi cho vấn đề trở lại trong ngày:
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;
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();
}
}
}
Tôi có đèn AutoFlash với ba bước đơn giản dưới đây.
<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" />
Trong Mã máy ảnh của bạn làm theo cách này.
//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 -> Bây giờ Chuyển đến khu vực ánh sáng Dim và Chụp ảnh nhanh, bạn sẽ nhận được đèn flash tự động nếu thiết bị hỗ trợ.
Android Lollipop đã giới thiệu API camera2 và không dùng API camera trước đó. Tuy nhiên, sử dụng API không dùng nữa để bật flash vẫn hoạt động và đơn giản hơn nhiều so với sử dụng API mới.
Có vẻ như API mới được thiết kế để sử dụng trong các ứng dụng máy ảnh chuyên dụng đầy đủ tính năng và các kiến trúc sư của nó đã không thực sự xem xét các trường hợp sử dụng đơn giản hơn như bật đèn pin. Để làm điều đó bây giờ, người ta phải có một Trình quản lý ảnh, tạo một CaptureSession với một bề mặt giả, và cuối cùng tạo và bắt đầu một CaptureRequest. Xử lý ngoại lệ, dọn dẹp tài nguyên và gọi lại dài bao gồm!
Để xem cách bật đèn pin trên Lollipop và mới hơn, hãy xem Đèn pin điều khiển trong dự án AOSP (thử tìm API mới nhất khi sử dụng cũ hơn đã được sửa đổi). Đừng quên thiết lập các quyền cần thiết.
Android Marshmallow cuối cùng đã giới thiệu một cách đơn giản để bật đèn flash với setTorchMode .
Mã hoàn chỉnh cho ứng dụng đèn pin android
Rõ ràng
<?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;
}
}
}
Có nhiều cách khác nhau để truy cập Camera Flash trong các phiên bản Android khác nhau. Rất ít API ngừng hoạt động trong Lollipop và sau đó nó đã được thay đổi một lần nữa trong Marshmallow. Để khắc phục điều này, tôi đã tạo ra một thư viện đơn giản mà tôi đã sử dụng trong một vài dự án của mình và nó cho kết quả tốt. Nó vẫn chưa hoàn thành, nhưng bạn có thể thử kiểm tra mã và tìm các phần còn thiếu. Đây là liên kết - NoobCameraFlash .
Nếu bạn chỉ muốn tích hợp vào mã của mình, bạn có thể sử dụng gradle cho điều đó. Đây là hướng dẫn (Lấy trực tiếp từ Readme) -
Bước 1. Thêm kho lưu trữ JitPack vào tệp xây dựng của bạn. Thêm nó vào bản dựng gốc của bạn. Nâng cấp ở cuối kho:
allprojects {
repositories {
...
maven { url "https://jitpack.io" }
}
}
Bước 2. Thêm phụ thuộc
dependencies {
compile 'com.github.Abhi347:NoobCameraFlash:0.0.1'
}
Khởi tạo NoobCameraManager
singleton.
NoobCameraManager.getInstance().init(this);
Bạn có thể tùy ý đặt Cấp độ nhật ký để ghi nhật ký gỡ lỗi. Ghi nhật ký sử dụng thư viện LumberJack . LogLevel mặc định làLogLevel.None
NoobCameraManager.getInstance().init(this, LogLevel.Verbose);
Sau đó, bạn chỉ cần gọi cho singleton để bật hoặc tắt đèn flash của camera.
NoobCameraManager.getInstance().turnOnFlash();
NoobCameraManager.getInstance().turnOffFlash();
Bạn phải tự chăm sóc các quyền thời gian chạy để truy cập Camera, trước khi khởi chạy NoobCameraManager. Trong phiên bản 0.1.2 trở về trước, chúng tôi đã từng cung cấp hỗ trợ cho các quyền trực tiếp từ thư viện, nhưng do phụ thuộc vào đối tượng Activity, chúng tôi phải xóa nó.
Thật dễ dàng để chuyển Flash
if(NoobCameraManager.getInstance().isFlashOn()){
NoobCameraManager.getInstance().turnOffFlash();
}else{
NoobCameraManager.getInstance().turnOnFlash();
}
You have to take care of the runtime permissions to access Camera yourself, before initializing the NoobCameraManager. In version 0.1.2 or earlier we used to provide support for permissions directly from the library, but due to dependency on the Activity object, we have to remove it.
Tôi đã triển khai chức năng này trong ứng dụng của mình thông qua các đoạn sử dụng SurfaceView. Liên kết đến câu hỏi stackoverflow này và câu trả lời của nó có thể được tìm thấy ở đây
Hi vọng điêu nay co ich :)
Trong Marshmallow trở lên, `setTorchMode () 'của CameraMan dường như là câu trả lời. Điều này làm việc cho tôi:
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);
Thử cái này.
CameraManager camManager = (CameraManager) getSystemService(Context.CAMERA_SERVICE);
String cameraId = null; // Usually front camera is at 0 position.
try {
cameraId = camManager.getCameraIdList()[0];
camManager.setTorchMode(cameraId, true);
} catch (CameraAccessException e) {
e.printStackTrace();
}