How to turn on front flash light programmatically in Android?

后端 未结 11 1591
执笔经年
执笔经年 2020-11-22 00:17

I want to turn on front flash light (not with camera preview) programmatically in Android. I googled for it but the help i found referred me to this page

Does anyo

相关标签:
11条回答
  • 2020-11-22 00:46

    For this problem you should:

    1. Check whether the flashlight is available or not?

    2. If so then Turn Off/On

    3. If not then you can do whatever, according to your app needs.

    For Checking availability of flash in the device:

    You can use the following:

     context.getPackageManager().hasSystemFeature(PackageManager.FEATURE_CAMERA_FLASH);
    

    which will return true if a flash is available, false if not.

    See:
    http://developer.android.com/reference/android/content/pm/PackageManager.html for more information.

    For turning on/off flashlight:

    I googled out and got this about android.permission.FLASHLIGHT. Android manifests' permission looks promising:

     <!-- 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" />
    

    Then make use of Camera and set Camera.Parameters. The main parameter used here is FLASH_MODE_TORCH.

    eg.

    Code Snippet to turn on camera flashlight.

    Camera cam = Camera.open();     
    Parameters p = cam.getParameters();
    p.setFlashMode(Parameters.FLASH_MODE_TORCH);
    cam.setParameters(p);
    cam.startPreview();
    

    Code snippet to turn off camera led light.

      cam.stopPreview();
      cam.release();
    

    I just found a project that uses this permission. Check quick-settings' src code. here http://code.google.com/p/quick-settings/ (Note: This link is now broken)

    For Flashlight directly look http://code.google.com/p/quick-settings/source/browse/trunk/quick-settings/#quick-settings/src/com/bwx/bequick/flashlight (Note: This link is now broken)

    Update6 You could also try to add a SurfaceView as described in this answer LED flashlight on Galaxy Nexus controllable by what API? This seems to be a solution that works on many phones.

    Update 5 Major Update

    I have found an alternative Link (for the broken links above): http://www.java2s.com/Open-Source/Android/Tools/quick-settings/com.bwx.bequick.flashlight.htm You can now use this link. [Update: 14/9/2012 This link is now broken]

    Update 1

    Another OpenSource Code : http://code.google.com/p/torch/source/browse/

    Update 2

    Example showing how to enable the LED on a Motorola Droid: http://code.google.com/p/droidled/

    Another Open Source Code :

    http://code.google.com/p/covedesigndev/
    http://code.google.com/p/search-light/

    Update 3 (Widget for turning on/off camera led)

    If you want to develop a widget that turns on/off your camera led, then you must refer my answer Widget for turning on/off camera flashlight in android..

    Update 4

    If you want to set the intensity of light emerging from camera LED you can refer Can I change the LED intensity of an Android device? full post. Note that only rooted HTC devices support this feature.

    ** Issues:**

    There are also some problems while turning On/Off flashlight. eg. for the devices not having FLASH_MODE_TORCH or even if it has, then flashlight does not turn ON etc.

    Typically Samsung creates a lot of problems.

    You can refer to problems in the given below list:

    Use camera flashlight in Android

    Turn ON/OFF Camera LED/flash light in Samsung Galaxy Ace 2.2.1 & Galaxy Tab

    0 讨论(0)
  • 2020-11-22 00:49

    There's different ways to access Camera Flash in different Android versions. Few APIs stopped working in Lollipop and then it got changed again in Marshmallow. To overcome this, I have created a simple library that I have been using in few of my projects and it's giving good results. It's still incomplete, but you can try to check the code and find the missing pieces. Here's the link - NoobCameraFlash.

    If you just want to integrate in your code, you can use gradle for that. Here's the instructions (Taken directly from the Readme) -

    Step 1. Add the JitPack repository to your build file. Add it in your root build.gradle at the end of repositories:

    allprojects {
            repositories {
                ...
                maven { url "https://jitpack.io" }
            }
    }
    

    Step 2. Add the dependency

    dependencies {
            compile 'com.github.Abhi347:NoobCameraFlash:0.0.1'
      }
    

    Usage

    Initialize the NoobCameraManager singleton.

    NoobCameraManager.getInstance().init(this);
    

    You can optionally set the Log Level for debug logging. Logging uses LumberJack library. The default LogLevel is LogLevel.None

    NoobCameraManager.getInstance().init(this, LogLevel.Verbose);
    

    After that you just need to call the singleton to turn on or off the camera flash.

    NoobCameraManager.getInstance().turnOnFlash();
    NoobCameraManager.getInstance().turnOffFlash();
    

    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.

    It's easy to toggle Flash too

    if(NoobCameraManager.getInstance().isFlashOn()){
        NoobCameraManager.getInstance().turnOffFlash();
    }else{
        NoobCameraManager.getInstance().turnOnFlash();
    }
    
    0 讨论(0)
  • 2020-11-22 00:51

    Complete Code for 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;
              }
          }
    
      }
    
    0 讨论(0)
  • 2020-11-22 00:57

    Try this.

    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();
        }
    
    0 讨论(0)
  • 2020-11-22 00:59

    I Got AutoFlash light with below simple Three Steps.

    • I just added Camera and Flash Permission in Manifest.xml file
    <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" />
    
    • In your Camera Code do this way.

      //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 Go to Dim light area and Snap photo, you should get auto flash light if device supports.

    0 讨论(0)
  • 2020-11-22 00:59

    I have implemented this function in my application through fragments using SurfaceView. The link to this stackoverflow question and its answer can be found here

    Hope this helps :)

    0 讨论(0)
提交回复
热议问题