Odpowiedzi:
W przypadku tego problemu należy:
Sprawdź, czy latarka jest dostępna, czy nie?
Jeśli tak, to wyłącz / włącz
Jeśli nie, możesz zrobić cokolwiek, zgodnie z potrzebami aplikacji.
Aby sprawdzić dostępność lampy błyskowej w urządzeniu:
Możesz użyć następujących opcji:
context.getPackageManager().hasSystemFeature(PackageManager.FEATURE_CAMERA_FLASH);
która zwróci true, jeśli flash jest dostępny, false jeśli nie.
Zobacz:
http://developer.android.com/reference/android/content/pm/PackageManager.html, aby uzyskać więcej informacji.
Aby włączyć / wyłączyć latarkę:
Wylogowałem się i dowiedziałem się o android.permission.FLASHLIGHT. Pozwolenie na manifesty Androida wygląda obiecująco:
<!-- 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" />
Następnie skorzystaj z Camera i ustaw Camera.Parameters . Głównym zastosowanym tutaj parametrem jest FLASH_MODE_TORCH .
na przykład.
Fragment kodu, aby włączyć latarkę aparatu.
Camera cam = Camera.open();
Parameters p = cam.getParameters();
p.setFlashMode(Parameters.FLASH_MODE_TORCH);
cam.setParameters(p);
cam.startPreview();
Fragment kodu, aby wyłączyć światło LED kamery.
cam.stopPreview();
cam.release();
Właśnie znalazłem projekt, który korzysta z tego uprawnienia. Sprawdź kod src szybkich ustawień. tutaj http://code.google.com/p/quick-settings/ (Uwaga: ten link jest teraz uszkodzony)
W przypadku Flashlight bezpośrednio spójrz http://code.google.com/p/quick-settings/source/browse/trunk/quick-settings/#quick-settings/src/com/bwx/bequick/flashlight (Uwaga: ten link jest teraz zepsuty)
Update6 Możesz również spróbować dodać SurfaceView zgodnie z opisem w tej odpowiedzi Latarka LED na Galaxy Nexus sterowanym przez jaki interfejs API? To wydaje się być rozwiązaniem, które działa na wielu telefonach.
Aktualizacja 5 Ważna aktualizacja
Znalazłem alternatywny link (dla powyższych zepsutych linków): http://www.java2s.com/Open-Source/Android/Tools/quick-settings/com.bwx.bequick.flashlight.htm Możesz teraz użyć tego połączyć. [Aktualizacja: 14/9/2012 Ten link jest teraz uszkodzony]
Aktualizacja 1
Kolejny kod OpenSource: http://code.google.com/p/torch/source/browse/
Aktualizacja 2
Przykład pokazujący, jak włączyć diodę LED w telefonie Motorola Droid: http://code.google.com/p/droidled/
Kolejny kod Open Source:
http://code.google.com/p/covedesigndev/
http://code.google.com/p/search-light/
Aktualizacja 3 (Widget do włączania / wyłączania diody LED kamery)
Jeśli chcesz opracować widget, który włącza / wyłącza diodę kamery , musisz odesłać moją odpowiedź Widget do włączania / wyłączania latarki aparatu w Androidzie ..
Aktualizacja 4
Jeśli chcesz ustawić intensywność światła wychodzącego z kamery LED, możesz odnieść się do tego. Czy mogę zmienić intensywność LED urządzenia z Androidem? pełny post. Pamiętaj, że tylko zrootowane urządzenia HTC obsługują tę funkcję.
** Zagadnienia:**
Istnieją również pewne problemy podczas włączania / wyłączania latarki. na przykład. dla urządzeń, które nie mają, FLASH_MODE_TORCH
a nawet jeśli tak, to latarka się nie włącza itp.
Zazwyczaj Samsung stwarza wiele problemów.
Możesz odnieść się do problemów z poniższej listy:
Użyj latarki aparatu w systemie Android
Włączanie / wyłączanie diody LED / lampy błyskowej aparatu w Samsung Galaxy Ace 2.2.1 i Galaxy Tab
Z mojego doświadczenia wynika, że jeśli twoja aplikacja jest przeznaczona do pracy zarówno w orientacji pionowej, jak i poziomej, musisz zadeklarować zmienną cam
jako statyczną. W przeciwnym razie, onDestroy()
zwany przełączaniem orientacji, niszczy go, ale nie zwalnia aparatu, więc nie można go ponownie otworzyć.
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();
}
}
}
aby się zamanifestować, musiałem umieścić tę linię
<uses-permission android:name="android.permission.CAMERA" />
z http://developer.android.com/reference/android/hardware/Camera.html
sugerowane linie powyżej nie działały dla mnie.
you need to declare the variable cam as static
Camera
klasy należy AndroidStudio
zwrócić uwagę na android.hardware
klasę ...
W API 23 lub nowszym (Android M, 6.0)
Włącz kod
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();
}
}
Wyłącz kod
camManager.setTorchMode(cameraId, false);
I uprawnienia
<uses-permission android:name="android.permission.CAMERA"/>
<uses-permission android:name="android.permission.FLASHLIGHT"/>
DODATKOWA EDYCJA
Ludzie wciąż oceniają moją odpowiedź, więc postanowiłem opublikować dodatkowy kod. Oto moje rozwiązanie problemu w przeszłości:
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();
}
}
}
Mam lampę AutoFlash z poniżej prostymi trzema krokami.
<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" />
Zrób to w kodzie aparatu.
//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();
Buduj + Uruchom -> Teraz przejdź do Przyciemnij obszar światła i Zrób zdjęcie, powinieneś dostać automatyczne światło lampy błyskowej, jeśli urządzenie obsługuje.
Android Lollipop wprowadził interfejs API camera2 i wycofał poprzedni interfejs API aparatu. Jednak użycie przestarzałego interfejsu API do włączenia pamięci flash nadal działa i jest znacznie prostsze niż użycie nowego interfejsu API.
Wygląda na to, że nowy interfejs API jest przeznaczony do użytku w dedykowanych aplikacjach z pełnymi funkcjami aparatu, a jego architekci tak naprawdę nie brali pod uwagę prostszych przypadków użycia, takich jak włączenie latarki. Aby to zrobić teraz, należy pobrać CameraManager, utworzyć CaptureSession z atrapą Surface, a na koniec utworzyć i uruchomić CaptureRequest. Uwzględniono obsługę wyjątków, czyszczenie zasobów i długie połączenia zwrotne!
Aby zobaczyć, jak włączyć latarkę w Lollipop i nowszych, spójrz na FlashlightController w projekcie AOSP (spróbuj znaleźć najnowsze, ponieważ starsze używają zmodyfikowanych interfejsów API). Nie zapomnij ustawić wymaganych uprawnień.
Android Marshmallow wreszcie wprowadził prosty sposób na włączenie flasha za pomocą setTorchMode .
Kompletny kod dla aplikacji Android Flashlight
Oczywisty
<?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;
}
}
}
Istnieją różne sposoby uzyskiwania dostępu do lampy błyskowej w różnych wersjach Androida. Kilka interfejsów API przestało działać w Lollipop, a następnie zostało ponownie zmienione w Marshmallow. Aby temu zaradzić, stworzyłem prostą bibliotekę, z której korzystałem w kilku moich projektach i daje dobre wyniki. Nadal jest niekompletny, ale możesz spróbować sprawdzić kod i znaleźć brakujące elementy. Oto link - NoobCameraFlash .
Jeśli chcesz po prostu zintegrować swój kod, możesz użyć do tego gradle. Oto instrukcje (zaczerpnięte bezpośrednio z Readme) -
Krok 1. Dodaj repozytorium JitPack do pliku kompilacji. Dodaj go do swojego root build.gradle na końcu repozytoriów:
allprojects {
repositories {
...
maven { url "https://jitpack.io" }
}
}
Krok 2. Dodaj zależność
dependencies {
compile 'com.github.Abhi347:NoobCameraFlash:0.0.1'
}
Zainicjuj NoobCameraManager
singletona.
NoobCameraManager.getInstance().init(this);
Opcjonalnie można ustawić poziom dziennika do rejestrowania debugowania. Rejestrowanie korzysta z biblioteki LumberJack . Domyślny LogLevel toLogLevel.None
NoobCameraManager.getInstance().init(this, LogLevel.Verbose);
Następnie wystarczy zadzwonić do singletona, aby włączyć lub wyłączyć lampę błyskową aparatu.
NoobCameraManager.getInstance().turnOnFlash();
NoobCameraManager.getInstance().turnOffFlash();
Przed zainicjowaniem NoobCameraManager musisz zadbać o uprawnienia środowiska wykonawczego, aby uzyskać dostęp do kamery. W wersji 0.1.2 lub wcześniejszej zapewnialiśmy obsługę uprawnień bezpośrednio z biblioteki, ale ze względu na zależność od obiektu Activity musimy go usunąć.
Łatwo też przełączyć 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.
Zaimplementowałem tę funkcję w mojej aplikacji poprzez fragmenty korzystające z SurfaceView. Link do tego pytania dotyczącego przepełnienia stosu i jego odpowiedź można znaleźć tutaj
Mam nadzieję że to pomoże :)
W Marshmallow i nowszych wydaje się, że `setTorchMode () 'CameraManager jest odpowiedzią. To działa dla mnie:
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);
Spróbuj tego.
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();
}