Antworten:
Für dieses Problem sollten Sie:
Überprüfen Sie, ob die Taschenlampe verfügbar ist oder nicht?
Wenn ja, dann aus- / einschalten
Wenn nicht, können Sie alles tun, was Ihren App-Anforderungen entspricht.
So überprüfen Sie die Verfügbarkeit von Flash im Gerät:
Sie können Folgendes verwenden:
context.getPackageManager().hasSystemFeature(PackageManager.FEATURE_CAMERA_FLASH);
Dies gibt true zurück, wenn ein Flash verfügbar ist, false, wenn nicht.
Weitere Informationen finden Sie unter:
http://developer.android.com/reference/android/content/pm/PackageManager.html .
Zum Ein- und Ausschalten der Taschenlampe:
Ich googelte und bekam dies über android.permission.FLASHLIGHT. Die Erlaubnis für Android-Manifeste sieht vielversprechend aus:
<!-- 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" />
Verwenden Sie dann Camera und stellen Sie Camera.Parameters ein . Der hier verwendete Hauptparameter ist FLASH_MODE_TORCH .
z.B.
Code-Snippet zum Einschalten der Taschenlampe der Kamera.
Camera cam = Camera.open();
Parameters p = cam.getParameters();
p.setFlashMode(Parameters.FLASH_MODE_TORCH);
cam.setParameters(p);
cam.startPreview();
Code-Snippet zum Ausschalten des LED-Lichts der Kamera.
cam.stopPreview();
cam.release();
Ich habe gerade ein Projekt gefunden, das diese Berechtigung verwendet. Überprüfen Sie den Quellcode der Schnelleinstellungen. hier http://code.google.com/p/quick-settings/ (Hinweis: Dieser Link ist jetzt defekt)
Informationen zur Taschenlampe finden Sie direkt unter http://code.google.com/p/quick-settings/source/browse/trunk/quick-settings/#quick-settings/src/com/bwx/bequick/flashlight (Hinweis: Dieser Link ist jetzt kaputt)
Update6 Sie können auch versuchen, eine SurfaceView hinzuzufügen, wie in dieser Antwort beschrieben. LED-Taschenlampe auf dem Galaxy Nexus, die mit welcher API gesteuert werden kann? Dies scheint eine Lösung zu sein, die auf vielen Telefonen funktioniert.
Update 5 Hauptupdate
Ich habe einen alternativen Link gefunden (für die defekten Links oben): http://www.java2s.com/Open-Source/Android/Tools/quick-settings/com.bwx.bequick.flashlight.htm Sie können diesen jetzt verwenden Verknüpfung. [Update: 14.9.2012 Dieser Link ist jetzt defekt]
Update 1
Ein weiterer OpenSource-Code: http://code.google.com/p/torch/source/browse/
Update 2
Beispiel für die Aktivierung der LED auf einem Motorola Droid: http://code.google.com/p/droidled/
Ein weiterer Open Source Code:
http://code.google.com/p/covedesigndev/
http://code.google.com/p/search-light/
Update 3 (Widget zum Ein- und Ausschalten der Kamera-LED)
Wenn Sie ein Widget entwickeln möchten, das Ihre Kamera-LED ein- und ausschaltet , müssen Sie meine Antwort Widget zum Ein- und Ausschalten der Taschenlampe in Android verwenden .
Update 4
Wenn Sie die Intensität des von der Kamera-LED austretenden Lichts einstellen möchten, können Sie sich darauf beziehen. Kann ich die LED-Intensität eines Android-Geräts ändern? vollständiger Beitrag. Beachten Sie, dass nur gerootete HTC-Geräte diese Funktion unterstützen.
** Probleme:**
Es gibt auch einige Probleme beim Ein- und Ausschalten der Taschenlampe. z.B. Für Geräte, die keine haben FLASH_MODE_TORCH
oder auch wenn dies der Fall ist, schaltet sich die Taschenlampe nicht ein usw.
Normalerweise verursacht Samsung viele Probleme.
Sie können auf Probleme in der folgenden Liste verweisen:
Verwenden Sie die Taschenlampe der Kamera in Android
Schalten Sie die Kamera-LED / das Blitzlicht in Samsung Galaxy Ace 2.2.1 und Galaxy Tab ein / aus
Nach meiner Erfahrung müssen Sie die Variable cam
als statisch deklarieren, wenn Ihre Anwendung sowohl im Hoch- als auch im Querformat arbeiten soll. Andernfalls onDestroy()
wird es beim Umschalten der Ausrichtung zerstört, die Kamera wird jedoch nicht freigegeben, sodass es nicht möglich ist, sie erneut zu öffnen.
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();
}
}
}
Um mich zu manifestieren, musste ich diese Linie setzen
<uses-permission android:name="android.permission.CAMERA" />
von http://developer.android.com/reference/android/hardware/Camera.html
Die oben vorgeschlagenen Zeilen funktionierten bei mir nicht.
you need to declare the variable cam as static
Camera
Klasse AndroidStudio
darauf, android.hardware
Klasse zu sein ...
In API 23 oder höher (Android M, 6.0)
Code einschalten
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();
}
}
Code ausschalten
camManager.setTorchMode(cameraId, false);
Und Berechtigungen
<uses-permission android:name="android.permission.CAMERA"/>
<uses-permission android:name="android.permission.FLASHLIGHT"/>
ZUSÄTZLICHE BEARBEITUNG
Die Leute haben meine Antwort immer noch positiv bewertet, also habe ich beschlossen, zusätzlichen Code zu veröffentlichen. Dies war früher meine Lösung für das Problem:
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();
}
}
}
Ich habe AutoFlash Licht mit unten einfachen drei Schritten.
<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" />
Gehen Sie in Ihrem Kameracode so vor.
//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();
Erstellen + Ausführen -> Gehen Sie jetzt zu Bereich für schwaches Licht und Foto aufnehmen. Wenn das Gerät dies unterstützt, sollten Sie ein automatisches Blitzlicht erhalten.
Android Lollipop führte die camera2- API ein und veraltete die vorherige Kamera-API. Die Verwendung der veralteten API zum Einschalten des Flashs funktioniert jedoch weiterhin und ist viel einfacher als die Verwendung der neuen API.
Es scheint, dass die neue API für die Verwendung in dedizierten Kamera-Apps mit vollem Funktionsumfang vorgesehen ist und dass die Architekten einfachere Anwendungsfälle wie das Einschalten der Taschenlampe nicht wirklich in Betracht gezogen haben. Dazu muss man sich jetzt einen CameraManager besorgen, eine CaptureSession mit einer Dummy-Oberfläche erstellen und schließlich eine CaptureRequest erstellen und starten. Ausnahmebehandlung, Ressourcenbereinigung und lange Rückrufe inklusive!
Schauen Sie sich den FlashlightController im AOSP-Projekt an, um zu sehen, wie Sie die Taschenlampe auf Lollipop und neueren Versionen einschalten können (versuchen Sie, die neuesten APIs für ältere Anwendungen zu finden, die geändert wurden). Vergessen Sie nicht, die erforderlichen Berechtigungen festzulegen.
Android Marshmallow hat endlich eine einfache Möglichkeit eingeführt, den Blitz mit setTorchMode einzuschalten .
Vollständiger Code für Android Flashlight App
Manifest
<?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;
}
}
}
Es gibt verschiedene Möglichkeiten, auf Camera Flash in verschiedenen Android-Versionen zuzugreifen. Nur wenige APIs funktionierten in Lollipop nicht mehr und wurden dann in Marshmallow erneut geändert. Um dies zu überwinden, habe ich eine einfache Bibliothek erstellt, die ich in einigen meiner Projekte verwendet habe und die gute Ergebnisse liefert. Es ist immer noch unvollständig, aber Sie können versuchen, den Code zu überprüfen und die fehlenden Teile zu finden. Hier ist der Link - NoobCameraFlash .
Wenn Sie nur in Ihren Code integrieren möchten, können Sie dafür gradle verwenden. Hier ist die Anleitung (direkt aus der Readme-Datei entnommen) -
Schritt 1. Fügen Sie das JitPack-Repository zu Ihrer Build-Datei hinzu. Fügen Sie es am Ende der Repositorys zu Ihrem root build.gradle hinzu:
allprojects {
repositories {
...
maven { url "https://jitpack.io" }
}
}
Schritt 2. Fügen Sie die Abhängigkeit hinzu
dependencies {
compile 'com.github.Abhi347:NoobCameraFlash:0.0.1'
}
Initialisieren Sie den NoobCameraManager
Singleton.
NoobCameraManager.getInstance().init(this);
Sie können optional die Protokollebene für die Debug-Protokollierung festlegen. Die Protokollierung verwendet die LumberJack- Bibliothek. Die Standard-LogLevel istLogLevel.None
NoobCameraManager.getInstance().init(this, LogLevel.Verbose);
Danach müssen Sie nur noch den Singleton anrufen, um den Kamerablitz ein- oder auszuschalten.
NoobCameraManager.getInstance().turnOnFlash();
NoobCameraManager.getInstance().turnOffFlash();
Sie müssen sich um die Laufzeitberechtigungen kümmern, um selbst auf die Kamera zugreifen zu können, bevor Sie den NoobCameraManager initialisieren. In Version 0.1.2 oder früher haben wir früher Berechtigungen direkt aus der Bibliothek unterstützt, aber aufgrund der Abhängigkeit vom Activity-Objekt müssen wir sie entfernen.
Es ist auch einfach, Flash umzuschalten
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.
Ich habe diese Funktion in meiner Anwendung durch Fragmente mit SurfaceView implementiert. Den Link zu dieser Stackoverflow-Frage und deren Antwort finden Sie hier
Hoffe das hilft :)
In Marshmallow und höher scheint CameraManagers "setTorchMode ()" die Antwort zu sein. Das funktioniert bei mir:
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);
Versuche dies.
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();
}