Come attivare la luce del flash anteriore a livello di codice in Android?


233

Voglio accendere la luce del flash anteriore (non con l'anteprima della fotocamera) a livello di codice in Android. Ho cercato su Google per questo, ma l'aiuto che ho trovato mi ha fatto riferimento a questa pagina

Qualcuno ha qualche link o codice di esempio?

Risposte:


401

Per questo problema dovresti:

  1. Controllare se la torcia è disponibile o no?

  2. In tal caso, spegnere / accendere

  3. 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_TORCHo 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:

Usa la torcia della fotocamera in Android

Accendi / spegni il LED della fotocamera / la luce del flash in Samsung Galaxy Ace 2.2.1 e Galaxy Tab


2
Grazie per il tuo aiuto, funziona per me! - Ho appena copiato l'interfaccia Flashlight e la classe HtcLedFlashlight, quindi ho appena chiamato il metodo setOn con true / false HtcLedFlashlight e questo. --- Interface-Flashlight code.google.com/p/quick-settings/source/browse/trunk/… - Class-HtcLedFlashlight code.google.com/p/quick-settings/source/browse/trunk/…
saiket,

1
@saiket: benvenuto .. se il problema è stato risolto, contrassegnare questa risposta come risolta. in modo che possa essere utile agli altri ..
Kartik Domadiya,

1
@PolamReddyRajaReddy: penso che tu stia testando su Samsung Device. Ho ragione ?
Kartik Domadiya,

7
per le autorizzazioni, il codice corretto nel file manifest è: `<usi-permesso android: nome =" android.permission.CAMERA "/> <usi-permesso android: name =" android.permission.FLASHLIGHT "/>`
ixeft

1
Utilizzare anche: - camera.release ();
Chetan,

35

Dalla mia esperienza, se la tua applicazione è progettata per funzionare in orientamento verticale e orizzontale, devi dichiarare la variabile camcome 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.


Non è necessario verificare la funzionalità del sistema se la fotocamera è spenta. Se cam! = Null, è stato attivato
Greg Ennis il

1
La parte più utile per me è statayou need to declare the variable cam as static
Alex Jolig,

Quando importate la CameraClasse AndroidStudio prestate attenzione ad essere la android.hardwareclasse ...
AN

32

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();
    }
}
}

2
Cosa intendi con "Di solito la fotocamera frontale è nella posizione 0"? Come posso verificare quale è davanti e quale no? A proposito, la fotocamera frontale è quella indirizzata all'utente corrente. La fotocamera posteriore è quella che probabilmente ha sempre il flash. E come posso verificare se il flash è acceso o spento?
sviluppatore Android

13

Ho ottenuto la luce AutoFlash con tre semplici passaggi di seguito.

  • Ho appena aggiunto le autorizzazioni per fotocamera e flash nel file Manifest.xml
<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.


9

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 .


1
La vecchia API android.hardware.Camera continua a funzionare esattamente come prima, quindi non c'è motivo fondamentale per utilizzare android.hardware.camera2 per la torcia. Tuttavia, è possibile ridurre il consumo di energia e il carico della CPU con camera2, poiché non è necessario mantenere un'anteprima attiva per abilitare la torcia.
Eddy Talvala,

Ho provato una delle implementazioni più semplici su due dispositivi Lollipop e non ha attivato il flash, anche se ha funzionato su tutti i diversi dispositivi pre-Lollipop su cui l'ho provato. Forse è solo un bug in Lollipop. Se i vecchi metodi funzionano ancora per te e se non sei un purista Java, continua a utilizzare la vecchia API in quanto è molto più semplice :)
LukaCiko

Al momento ho un Nexus 5 con Lollipop e funziona perfettamente. Possiedo anche un'applicazione creata da me stesso ed è implementata con questi metodi. Nel caso qualcuno voglia provarlo. Ho inserito un link nel Play Store: play.google.com/store/apps/details?id=com.fadad.linterna L'importante è soprattutto assicurarsi che la fotocamera sia attiva o disabilitata prima di eseguire il flash e le autorizzazioni.
ferdiado,

Scusa, errore mio. Un'altra app stava probabilmente usando la fotocamera quando ho provato ad accendere il flash con la vecchia API. Ho aggiornato la risposta.
LukaCiko,

7

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;
          }
      }

  }

se il flash è già attivo prima di iniziare l'esempio, quindi provare a disattivare il flash non funzionerà ... hai una soluzione per quel problema?
Taifun,

7

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'
  }

uso

Inizializza il NoobCameraManagersingleton.

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();
}

Aggiungi il supporto per l'utilizzo di Context anziché di Activity. Grazie!
Vajira Lasantha,

@VajiraLasantha L'oggetto Activity è necessario per ottenere l'autorizzazione. Avevo intenzione di rimuovere completamente il requisito separando le autorizzazioni in qualche modo. È stato monitorato qui - github.com/Abhi347/NoobCameraFlash/issues/3 Nel frattempo, è possibile modificare il codice per rimuovere il requisito, se lo si desidera. Potrei aver bisogno di un po 'di tempo per lavorarci su.
Noob,

Sì, l'ho visto. Ho già modificato la tua libreria in modo che funzioni con Context rimuovendo le autorizzazioni. Perché la mia app esegue già convalide delle autorizzazioni. Per favore fatemi sapere quando avete rilasciato un'implementazione corretta che supporta il contesto. Grazie!
Vajira Lasantha,

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.
Pratik Butani,

Cosa succede se sul dispositivo sono presenti più flash? Alcuni hanno sulla fotocamera frontale ...
sviluppatore Android

0

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 :)


0

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);

0

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();
    }

-3

È inoltre possibile utilizzare il seguente codice per disattivare il flash.

Camera.Parameters params = mCamera.getParameters()
p.setFlashMode(Parameters.FLASH_MODE_OFF);
mCamera.setParameters(params);
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.