Jawaban:
Untuk masalah ini Anda harus:
Periksa apakah senter tersedia atau tidak?
Jika demikian maka Matikan / Hidupkan
Jika tidak maka Anda bisa melakukan apa saja, sesuai dengan kebutuhan aplikasi Anda.
Untuk Memeriksa ketersediaan flash di perangkat:
Anda dapat menggunakan yang berikut ini:
context.getPackageManager().hasSystemFeature(PackageManager.FEATURE_CAMERA_FLASH);
yang akan mengembalikan true jika flash tersedia, false jika tidak.
Lihat:
http://developer.android.com/reference/android/content/pm/PackageManager.html untuk informasi lebih lanjut.
Untuk menyalakan / mematikan senter:
Saya mencari di Google dan mengetahui tentang android.permission.FLASHLIGHT ini. Izin manifes Android terlihat menjanjikan:
<!-- 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" />
Kemudian gunakan Camera dan atur Camera.Parameters . Parameter utama yang digunakan di sini adalah FLASH_MODE_TORCH .
misalnya.
Cuplikan Kode untuk menyalakan senter kamera.
Camera cam = Camera.open();
Parameters p = cam.getParameters();
p.setFlashMode(Parameters.FLASH_MODE_TORCH);
cam.setParameters(p);
cam.startPreview();
Cuplikan kode untuk mematikan lampu led kamera.
cam.stopPreview();
cam.release();
Saya baru saja menemukan proyek yang menggunakan izin ini. Periksa kode src pengaturan cepat. di sini http://code.google.com/p/quick-settings/ (Catatan: Tautan ini sekarang rusak)
Untuk Flashlight secara langsung lihat http://code.google.com/p/quick-settings/source/browse/trunk/quick-settings/#quick-settings/src/com/bwx/bequick/flashlight (Catatan: Tautan ini sekarang rusak)
Update6 Anda juga bisa mencoba menambahkan SurfaceView seperti yang dijelaskan dalam jawaban ini senter LED pada Galaxy Nexus yang dapat dikontrol oleh API apa? Ini sepertinya menjadi solusi yang berfungsi pada banyak ponsel.
Perbarui 5 Pembaruan Besar
Saya telah menemukan Tautan alternatif (untuk tautan rusak di atas): http://www.java2s.com/Open-Source/Android/Tools/quick-settings/com.bwx.bequick.flashlight.htm Sekarang Anda dapat menggunakan ini tautan. [Pembaruan: 14/9/2012 Tautan ini sekarang rusak]
Perbarui 1
Kode OpenSource lain: http://code.google.com/p/torch/source/browse/
Perbarui 2
Contoh yang menunjukkan cara mengaktifkan LED pada Motorola Droid: http://code.google.com/p/droidled/
Kode Sumber Terbuka Lain:
http://code.google.com/p/covedesigndev/
http://code.google.com/p/search-light/
Pembaruan 3 (Widget untuk menghidupkan / mematikan kamera yang dipimpin)
Jika Anda ingin mengembangkan widget yang menghidupkan / mematikan kamera Anda, maka Anda harus merujuk Widget jawaban saya untuk menghidupkan / mematikan senter kamera di android ..
Perbarui 4
Jika Anda ingin mengatur intensitas cahaya yang muncul dari LED kamera Anda dapat merujuk Dapatkah saya mengubah intensitas LED dari perangkat Android?pos penuh. Perhatikan bahwa hanya perangkat HTC yang di-rooting yang mendukung fitur ini.
** Masalah:**
Ada juga beberapa masalah saat menyalakan / mematikan senter. misalnya. untuk perangkat yang tidak memiliki FLASH_MODE_TORCH
atau bahkan jika ada, maka senter tidak menyala, dll.
Biasanya Samsung menciptakan banyak masalah.
Anda dapat merujuk masalah dalam daftar di bawah ini:
Gunakan senter kamera di Android
Hidupkan / Matikan LED Kamera / lampu flash di Samsung Galaxy Ace 2.2.1 & Galaxy Tab
Dari pengalaman saya, jika aplikasi Anda dirancang untuk bekerja dalam orientasi potret dan lanskap, Anda perlu mendeklarasikan variabel cam
sebagai statis. Kalau tidak, onDestroy()
yang disebut orientasi switching, menghancurkannya tetapi tidak merilis Kamera sehingga tidak mungkin untuk membukanya kembali.
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();
}
}
}
untuk mewujudkan saya harus meletakkan garis ini
<uses-permission android:name="android.permission.CAMERA" />
dari http://developer.android.com/reference/android/hardware/Camera.html
baris yang disarankan di atas tidak bekerja untuk saya.
you need to declare the variable cam as static
Camera
Kelas, AndroidStudio
perhatikan android.hardware
kelas ...
Di API 23 atau lebih tinggi (Android M, 6.0)
Aktifkan kode
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();
}
}
Matikan kode
camManager.setTorchMode(cameraId, false);
Dan Izin
<uses-permission android:name="android.permission.CAMERA"/>
<uses-permission android:name="android.permission.FLASHLIGHT"/>
EDIT TAMBAHAN
Orang-orang masih memperbaiki jawaban saya jadi saya memutuskan untuk mengirim kode tambahan Ini adalah solusi saya untuk masalah di masa lalu:
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();
}
}
}
Saya Dapat cahaya AutoFlash dengan Tiga Langkah sederhana di bawah ini.
<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" />
Dalam Kode Kamera Anda, lakukan cara ini.
//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 -> Now Pergi ke area redup cahaya dan Jepret foto, Anda akan mendapatkan lampu flash otomatis jika perangkat mendukung.
Android Lollipop memperkenalkan camera2 API dan menghentikan API kamera sebelumnya. Namun, menggunakan API yang sudah tidak digunakan lagi untuk menghidupkan flash masih berfungsi dan jauh lebih sederhana daripada menggunakan API baru.
Tampaknya API baru dimaksudkan untuk digunakan dalam aplikasi kamera berfitur lengkap dan arsiteknya tidak benar-benar mempertimbangkan kasus penggunaan yang lebih sederhana seperti menyalakan lampu senter. Untuk melakukan itu sekarang, kita harus mendapatkan CameraManager, membuat CaptureSession dengan Permukaan dummy, dan akhirnya membuat dan memulai CaptureRequest. Penanganan pengecualian, pembersihan sumber daya, dan panggilan balik yang panjang sudah termasuk!
Untuk melihat cara menyalakan lampu senter pada Lollipop dan yang lebih baru, lihatlah FlashlightController di proyek AOSP (cobalah untuk menemukan yang terbaru sebagai API penggunaan lama yang telah dimodifikasi). Jangan lupa untuk mengatur izin yang diperlukan.
Android Marshmallow akhirnya memperkenalkan cara sederhana untuk menyalakan flash dengan setTorchMode .
Kode Lengkap untuk Aplikasi Senter android
Nyata
<?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;
}
}
}
Ada berbagai cara untuk mengakses Flash Kamera dalam berbagai versi Android. Beberapa API berhenti bekerja di Lollipop dan kemudian diubah lagi di Marshmallow. Untuk mengatasinya, saya telah membuat perpustakaan sederhana yang telah saya gunakan di beberapa proyek saya dan memberikan hasil yang baik. Ini masih belum lengkap, tetapi Anda dapat mencoba memeriksa kode dan menemukan bagian yang hilang. Inilah tautannya - NoobCameraFlash .
Jika Anda hanya ingin mengintegrasikan kode Anda, Anda bisa menggunakan gradle untuk itu. Ini instruksinya (Diambil langsung dari Readme) -
Langkah 1. Tambahkan repositori JitPack ke file build Anda. Tambahkan di root build.gradle Anda di akhir repositori:
allprojects {
repositories {
...
maven { url "https://jitpack.io" }
}
}
Langkah 2. Tambahkan ketergantungan
dependencies {
compile 'com.github.Abhi347:NoobCameraFlash:0.0.1'
}
Inisialisasi NoobCameraManager
singleton.
NoobCameraManager.getInstance().init(this);
Anda secara opsional dapat mengatur Level Log untuk logging debug. Logging menggunakan perpustakaan LumberJack . LogLevel default adalahLogLevel.None
NoobCameraManager.getInstance().init(this, LogLevel.Verbose);
Setelah itu Anda hanya perlu memanggil singleton untuk menghidupkan atau mematikan flash kamera.
NoobCameraManager.getInstance().turnOnFlash();
NoobCameraManager.getInstance().turnOffFlash();
Anda harus mengurus izin runtime untuk mengakses Camera sendiri, sebelum menginisialisasi NoobCameraManager. Dalam versi 0.1.2 atau sebelumnya, kami dulu memberikan dukungan untuk izin langsung dari pustaka, tetapi karena ketergantungan pada objek Aktivitas, kami harus menghapusnya.
Mudah untuk mengaktifkan Flash juga
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.
Saya telah mengimplementasikan fungsi ini dalam aplikasi saya melalui fragmen menggunakan SurfaceView. Tautan ke pertanyaan stackoverflow ini dan jawabannya dapat ditemukan di sini
Semoga ini membantu :)
Di Marshmallow dan di atasnya, `setTorchMode () 'dari CameraManager tampaknya menjadi jawabannya. Ini bekerja untuk saya:
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);
Coba ini.
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();
}