Risposte:
Per questo problema dovresti:
Controllare se la torcia è disponibile o no?
In tal caso, spegnere / accendere
In caso contrario, puoi fare qualsiasi cosa, in base alle esigenze della tua app.
Per la verifica della disponibilità del flash nel dispositivo:
È possibile utilizzare quanto segue:
context.getPackageManager().hasSystemFeature(PackageManager.FEATURE_CAMERA_FLASH);
che restituirà vero se è disponibile un flash, falso in caso contrario.
Vedere:
http://developer.android.com/reference/android/content/pm/PackageManager.html per ulteriori informazioni.
Per accendere / spegnere la torcia:
Ho cercato su google e ho trovato questo su android.permission.FLASHLIGHT. L'autorizzazione dei manifesti Android sembra promettente:
<!-- 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" />
Quindi utilizzare la fotocamera e impostare Camera.Parameters . Il parametro principale utilizzato qui è FLASH_MODE_TORCH .
per esempio.
Snippet di codice per attivare la torcia della fotocamera.
Camera cam = Camera.open();
Parameters p = cam.getParameters();
p.setFlashMode(Parameters.FLASH_MODE_TORCH);
cam.setParameters(p);
cam.startPreview();
Snippet di codice per spegnere la luce led della fotocamera.
cam.stopPreview();
cam.release();
Ho appena trovato un progetto che utilizza questa autorizzazione. Controlla il codice src delle impostazioni rapide. qui http://code.google.com/p/quick-settings/ (Nota: questo link è ora interrotto)
Per la torcia, guarda direttamente http://code.google.com/p/quick-settings/source/browse/trunk/quick-settings/#quick-settings/src/com/bwx/bequick/flashlight (Nota: questo link è ora rotto)
Update6 Potresti anche provare ad aggiungere un SurfaceView come descritto in questa risposta Torcia a LED su Galaxy Nexus controllabile da quale API? Questa sembra essere una soluzione che funziona su molti telefoni.
Aggiornamento 5 Aggiornamento principale
Ho trovato un collegamento alternativo (per i collegamenti interrotti sopra): http://www.java2s.com/Open-Source/Android/Tools/quick-settings/com.bwx.bequick.flashlight.htm Ora puoi usare questo collegamento. [Aggiornamento: 14/9/2012 Questo link è ora rotto]
Aggiornamento 1
Un altro codice OpenSource: http://code.google.com/p/torch/source/browse/
Aggiornamento 2
Esempio che mostra come abilitare il LED su un Motorola Droid: http://code.google.com/p/droidled/
Un altro codice open source:
http://code.google.com/p/covedesigndev/
http://code.google.com/p/search-light/
Aggiornamento 3 (Widget per accendere / spegnere il led della videocamera)
Se vuoi sviluppare un widget che accenda / spenga il led della tua fotocamera, devi fare riferimento alla mia risposta Widget per accendere / spegnere la torcia della fotocamera in Android ..
Aggiornamento 4
Se si desidera impostare l'intensità della luce che emerge dal LED della fotocamera, è possibile fare riferimento È possibile modificare l'intensità del LED di un dispositivo Android? post completo. Nota che solo i dispositivi HTC rooted supportano questa funzione.
** Problemi:**
Ci sono anche alcuni problemi durante l'accensione / spegnimento della torcia. per esempio. per i dispositivi che non hanno FLASH_MODE_TORCH
o anche se hanno, quindi la torcia non si accende ecc.
In genere Samsung crea molti problemi.
È possibile fare riferimento ai problemi nell'elenco riportato di seguito:
Dalla mia esperienza, se la tua applicazione è progettata per funzionare in orientamento verticale e orizzontale, devi dichiarare la variabile cam
come statica. Altrimenti, onDestroy()
che viene chiamato sul cambio di orientamento, lo distrugge ma non rilascia la fotocamera, quindi non è possibile riaprirlo nuovamente.
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();
}
}
}
per manifestare ho dovuto mettere questa linea
<uses-permission android:name="android.permission.CAMERA" />
da http://developer.android.com/reference/android/hardware/Camera.html
le righe suggerite sopra non funzionavano per me.
you need to declare the variable cam as static
Camera
Classe AndroidStudio
prestate attenzione ad essere la android.hardware
classe ...
In API 23 o successive (Android M, 6.0)
Attiva il codice
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();
}
}
Disattiva il codice
camManager.setTorchMode(cameraId, false);
E permessi
<uses-permission android:name="android.permission.CAMERA"/>
<uses-permission android:name="android.permission.FLASHLIGHT"/>
MODIFICA AGGIUNTIVA
Le persone continuano a votare la mia risposta, così ho deciso di pubblicare un codice aggiuntivo Questa era la mia soluzione per il problema nel passato:
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();
}
}
}
Ho ottenuto la luce AutoFlash con tre semplici passaggi di seguito.
<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" />
Nel codice della videocamera, procedere in questo modo.
//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();
Costruisci + Esegui -> Ora vai all'area luce fioca e scatta foto, dovresti ottenere la luce flash automatica se il dispositivo supporta.
Android Lollipop ha introdotto l' API camera2 e ha deprecato l'API della fotocamera precedente. Tuttavia, l'utilizzo dell'API obsoleta per attivare il flash funziona ancora ed è molto più semplice rispetto all'utilizzo della nuova API.
Sembra che la nuova API sia destinata all'uso in app per fotocamere con funzionalità complete dedicate e che i suoi architetti non abbiano davvero considerato casi d'uso più semplici come l'accensione della torcia. Per farlo ora, è necessario ottenere un CameraManager, creare una CaptureSession con una superficie fittizia e infine creare e avviare una CaptureRequest. Gestione delle eccezioni, pulizia delle risorse e lunghi callback inclusi!
Per vedere come accendere la torcia su Lollipop e versioni successive, dai un'occhiata a FlashlightController nel progetto AOSP (prova a trovare le API di uso più recenti che sono state modificate). Non dimenticare di impostare le autorizzazioni necessarie.
Android Marshmallow ha finalmente introdotto un modo semplice per attivare il flash con setTorchMode .
Codice completo per Android Flashlight App
Manifesto
<?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;
}
}
}
Esistono diversi modi per accedere a Flash della fotocamera in diverse versioni di Android. Poche API hanno smesso di funzionare in Lollipop e sono state nuovamente modificate in Marshmallow. Per ovviare a questo, ho creato una semplice libreria che ho usato in alcuni dei miei progetti e sta dando buoni risultati. È ancora incompleto, ma puoi provare a controllare il codice e trovare i pezzi mancanti. Ecco il link - NoobCameraFlash .
Se vuoi solo integrarti nel tuo codice, puoi usare gradle per quello. Ecco le istruzioni (prese direttamente dal file Leggimi) -
Passaggio 1. Aggiungere il repository JitPack al file di build. Aggiungilo nel tuo build.gradle di root alla fine dei repository:
allprojects {
repositories {
...
maven { url "https://jitpack.io" }
}
}
Passaggio 2. Aggiungere la dipendenza
dependencies {
compile 'com.github.Abhi347:NoobCameraFlash:0.0.1'
}
Inizializza il NoobCameraManager
singleton.
NoobCameraManager.getInstance().init(this);
È possibile impostare facoltativamente il livello di registro per la registrazione di debug. La registrazione utilizza la libreria LumberJack . LogLevel predefinito èLogLevel.None
NoobCameraManager.getInstance().init(this, LogLevel.Verbose);
Dopodiché devi solo chiamare il singleton per attivare o disattivare il flash della fotocamera.
NoobCameraManager.getInstance().turnOnFlash();
NoobCameraManager.getInstance().turnOffFlash();
È necessario prendersi cura delle autorizzazioni di runtime per accedere a Camera da soli, prima di inizializzare NoobCameraManager. Nella versione 0.1.2 o precedente fornivamo supporto per le autorizzazioni direttamente dalla libreria, ma a causa della dipendenza dall'oggetto Activity, dobbiamo rimuoverlo.
È anche facile attivare / disattivare 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.
Ho implementato questa funzione nella mia applicazione attraverso frammenti usando SurfaceView. Il collegamento a questa domanda StackOverflow e la sua risposta sono disponibili qui
Spero che questo ti aiuti :)
In Marshmallow e versioni successive, `setTorchMode () 'di CameraManager sembra essere la risposta. Questo funziona per me:
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);
Prova questo.
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();
}