ฉันต้องการเปิดไฟแฟลชด้านหน้า (ไม่ใช่ภาพตัวอย่างจากกล้อง) โดยทางโปรแกรมใน Android ฉัน googled มัน แต่ความช่วยเหลือที่ฉันพบเรียกฉันมายังหน้านี้
ใครบ้างมีลิงค์หรือรหัสตัวอย่าง?
ฉันต้องการเปิดไฟแฟลชด้านหน้า (ไม่ใช่ภาพตัวอย่างจากกล้อง) โดยทางโปรแกรมใน Android ฉัน googled มัน แต่ความช่วยเหลือที่ฉันพบเรียกฉันมายังหน้านี้
ใครบ้างมีลิงค์หรือรหัสตัวอย่าง?
คำตอบ:
สำหรับปัญหานี้คุณควร:
ตรวจสอบว่ามีไฟฉายหรือไม่?
หากเป็นเช่นนั้นให้ปิด / เปิด
ถ้าไม่เช่นนั้นคุณสามารถทำอะไรก็ได้ตามที่แอพของคุณต้องการ
สำหรับการตรวจสอบความพร้อมของแฟลชในอุปกรณ์:
คุณสามารถใช้สิ่งต่อไปนี้:
context.getPackageManager().hasSystemFeature(PackageManager.FEATURE_CAMERA_FLASH);
ซึ่งจะคืนค่าจริงหากมีแฟลชให้ใช้งานผิดถ้าไม่ใช่
ดู:
http://developer.android.com/reference/android/content/pm/PackageManager.htmlสำหรับข้อมูลเพิ่มเติม
สำหรับการเปิด / ปิดไฟฉาย:
ฉัน googled ออกและได้รับสิ่งนี้เกี่ยวกับ 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.Parameters พารามิเตอร์หลักที่ใช้ที่นี่เป็นFLASH_MODE_TORCH
เช่น.
Code Snippet เพื่อเปิดไฟฉายกล้อง
Camera cam = Camera.open();
Parameters p = cam.getParameters();
p.setFlashMode(Parameters.FLASH_MODE_TORCH);
cam.setParameters(p);
cam.startPreview();
ข้อมูลโค้ดเพื่อปิดไฟ LED ของกล้อง
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 ดังที่อธิบายไว้ในคำตอบนี้ไฟฉาย LED บน 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
ตัวอย่างแสดงวิธีเปิดใช้งาน LED บน Motorola Droid: http://code.google.com/p/droidled/
รหัสโอเพนซอร์สอื่น:
http://code.google.com/p/covedesigndev/
http://code.google.com/p/search-light/
อัปเดต 3 (วิดเจ็ตสำหรับเปิด / ปิดกล้อง LED)
หากคุณต้องการพัฒนาเครื่องมือที่เปิด / ปิดกล้องของคุณคุณต้องอ้างอิงWidgetคำตอบของฉัน สำหรับการเปิด / ปิดไฟฉายกล้องใน android ..
อัปเดต 4
หากคุณต้องการตั้งค่าความเข้มของแสงที่เกิดจาก LED กล้องคุณสามารถดูฉันจะเปลี่ยนความเข้ม LED ของอุปกรณ์ Android ได้หรือไม่? โพสต์แบบเต็ม โปรดทราบว่าเฉพาะอุปกรณ์ HTC ที่รูทเครื่องเท่านั้นที่รองรับคุณสมบัตินี้
** ประเด็น: **
นอกจากนี้ยังมีปัญหาบางอย่างในขณะที่เปิด / ปิดไฟฉาย เช่น. สำหรับอุปกรณ์ที่ไม่มีFLASH_MODE_TORCH
หรือแม้ว่าจะมีแล้วไฟฉายก็ไม่เปิด ฯลฯ
โดยทั่วไปแล้ว Samsung จะสร้างปัญหามากมาย
คุณสามารถอ้างถึงปัญหาในรายการด้านล่าง:
เปิด / ปิดกล้อง LED / แสงแฟลชใน 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
บรรทัดที่แนะนำด้านบนไม่ทำงานสำหรับฉัน
you need to declare the variable cam as static
ใน 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;
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 -> ตอนนี้ไปที่พื้นที่หรี่แสงและถ่ายภาพคุณควรได้รับแสงแฟลชอัตโนมัติหากอุปกรณ์รองรับ
Android Lollipop เปิดตัวcamera2 API และเลิกใช้ API กล้องก่อนหน้านี้ อย่างไรก็ตามการใช้ API ที่เลิกใช้เพื่อเปิดแฟลชยังทำงานได้และง่ายกว่าการใช้ API ใหม่
ดูเหมือนว่า API ใหม่มีไว้สำหรับใช้ในแอพกล้องที่มีคุณสมบัติครบถ้วนและสถาปนิกไม่ได้พิจารณากรณีการใช้ที่ง่ายกว่าเช่นการเปิดไฟฉาย ในการทำเช่นนั้นตอนนี้เราต้องได้รับ CameraManager สร้าง CaptureSession ด้วย Surface จำลองและสุดท้ายสร้างและเริ่ม CaptureRequest การจัดการข้อยกเว้นการล้างทรัพยากรและการโทรกลับที่ยาวนาน!
หากต้องการดูวิธีเปิดไฟฉายใน Lollipop และรุ่นที่ใหม่กว่าให้ดูที่FlashlightControllerในโครงการ AOSP (ลองค้นหา API ใหม่ล่าสุดที่เป็น 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 ลงในไฟล์บิลด์ของคุณ เพิ่มใน 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);
คุณสามารถเลือกที่จะตั้งค่าระดับการบันทึกสำหรับการบันทึกการดีบัก การบันทึกใช้ไลบรารีLumberJack LogLevel เริ่มต้นคือLogLevel.None
NoobCameraManager.getInstance().init(this, LogLevel.Verbose);
หลังจากนั้นคุณเพียงแค่โทรไปที่ซิงเกิลตันเพื่อเปิดหรือปิดแฟลชกล้อง
NoobCameraManager.getInstance().turnOnFlash();
NoobCameraManager.getInstance().turnOffFlash();
คุณต้องดูแลสิทธิ์รันไทม์เพื่อเข้าถึงกล้องถ่ายรูปด้วยตัวเองก่อนที่จะเริ่มต้น NoobCameraManager ในเวอร์ชัน 0.1.2 หรือก่อนหน้านี้เราใช้เพื่อให้การสนับสนุนสิทธิ์โดยตรงจากไลบรารี แต่เนื่องจากการพึ่งพาวัตถุกิจกรรมเราต้องลบมันออก
มันง่ายที่จะสลับ 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.
ฉันใช้ฟังก์ชั่นนี้ในแอปพลิเคชันของฉันผ่านแฟรกเมนต์โดยใช้ SurfaceView ลิงก์ไปยังคำถามสแต็คโอเวอร์โฟลว์นี้และคำตอบมีอยู่ที่นี่
หวังว่าจะช่วย :)
ใน 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);
ลองสิ่งนี้
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();
}
คุณสามารถใช้รหัสต่อไปนี้เพื่อปิดแฟลชได้
Camera.Parameters params = mCamera.getParameters()
p.setFlashMode(Parameters.FLASH_MODE_OFF);
mCamera.setParameters(params);