Как программно включить фронтальную вспышку в Android? - PullRequest
219 голосов
/ 20 мая 2011

Я хочу включить переднюю вспышку (не с предварительным просмотром камеры) программно в Android.Я гуглил это, но помощь, которую я нашел, отсылала меня к этой странице

У кого-нибудь есть какие-либо ссылки или образец кода?

Ответы [ 10 ]

383 голосов
/ 20 мая 2011

Для решения этой проблемы вам необходимо:

  1. Проверить, доступен ли фонарик или нет?

  2. Если это так, то выключить / включить

  3. Если нет, то вы можете делать все что угодно, в соответствии с потребностями вашего приложения.

Для Проверка наличия вспышки вустройство:

Вы можете использовать следующее:

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

, которое вернет истину, если вспышка доступна, и ложь, если нет.

См .:
http://developer.android.com/reference/android/content/pm/PackageManager.html для получения дополнительной информации.

Для включения / выключения фонарика:

Я погуглил и получил информацию об android.permission.FLASHLIGHT.Разрешения манифестов Android выглядят многообещающе:

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

Затем используйте Камера и установите Камера. Параметры .Основной параметр, используемый здесь: FLASH_MODE_TORCH .

например.

Фрагмент кода для включения фонарика камеры.

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

Фрагмент кода для выключения света камеры.

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

Я только что нашел проект, который использует это разрешение.Проверьте код src быстрых настроек.здесь http://code.google.com/p/quick-settings/ (Примечание: эта ссылка теперь не работает)

Для фонарика смотрите прямо http://code.google.com/p/quick-settings/source/browse/trunk/quick-settings/#quick-settings/src/com/bwx/bequick/flashlight (Примечание: эта ссылка теперь не работает)

Обновление 6 Вы также можете попробовать добавить SurfaceView, как описано в этом ответе Светодиодный фонарик на Galaxy Nexus, управляемый каким API? Это решение, которое работает на многих телефонах.

Обновление 5 Основное обновление

Я нашел альтернативную ссылку (для неработающих ссылок выше): http://www.java2s.com/Open-Source/Android/Tools/quick-settings/com.bwx.bequick.flashlight.htm Теперь вы можете использовать эту ссылку.[Обновление: 14/9/2012 Ссылка теперь не работает]

Обновление 1

Другой код OpenSource: http://code.google.com/p/torch/source/browse/

Обновление 2

Пример, показывающий, как включить светодиод на Motorola Droid: http://code.google.com/p/droidled/

Другой открытый исходный код:

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

Обновление 3 (виджет для включения / выключения светодиода камеры)

Если вы хотите разработать виджет, который включает / выключает светодиод камеры, то выдолжен сослаться мой ответ Виджет для включения / выключения фонарика камеры в Android ..

Обновление 4

Если вы хотите установить интенсивностьсвет, исходящий от светодиода камеры, вы можете сослаться Можно ли изменить интенсивность светодиодов на устройстве Android? полный пост.Обратите внимание, что только корневые устройства HTC поддерживают эту функцию.

** Проблемы: **

Есть также некоторые проблемы при включении / выключении фонарика.например.для устройств, у которых нет FLASH_MODE_TORCH или даже если он есть, фонарик не включается и т. д.

Обычно Samsung создает много проблем.

Вы можете обратиться к проблемам в приведенном ниже списке:

Использовать фонарик камеры в Android

Включить / выключить светодиод камеры /Вспышка в Samsung Galaxy Ace 2.2.1 и Galaxy Tab

35 голосов
/ 29 декабря 2012

По моему опыту, если ваше приложение предназначено для работы как в книжной, так и в альбомной ориентации, вам нужно объявить переменную cam как статическую. В противном случае onDestroy(), который вызывается при переключении ориентации, разрушает его, но не освобождает камеру, поэтому невозможно снова открыть его.

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

чтобы проявить, я должен был поставить эту строку

    <uses-permission android:name="android.permission.CAMERA" />

от http://developer.android.com/reference/android/hardware/Camera.html

предложенные строки не работают для меня.

17 голосов
/ 22 ноября 2016

В API 23 или выше (Android M, 6.0)

Код включения

if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
    CameraManager camManager = (CameraManager) getSystemService(Context.CAMERA_SERVICE);
    String cameraId = null; // Usually back camera is at 0 position.
    try {
        cameraId = camManager.getCameraIdList()[0];
        camManager.setTorchMode(cameraId, true);   //Turn ON
    } catch (CameraAccessException e) {
        e.printStackTrace();
    }
}

Код выключения

camManager.setTorchMode(cameraId, false);

и разрешения

<uses-permission android:name="android.permission.CAMERA"/>
<uses-permission android:name="android.permission.FLASHLIGHT"/>

ДОПОЛНИТЕЛЬНОЕ РЕДАКТИРОВАНИЕ

Люди все еще голосуют против моего ответа, поэтому я решил опубликовать дополнительный код Это было мое решение проблемы в тот день:

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; // Usually front camera is at 0 position.
            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();
    }
}
}
13 голосов
/ 14 ноября 2013

У меня есть лампа AutoFlash с тремя простыми шагами.

  • Я только что добавил разрешение камеры и вспышки в 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" />
  • В вашем коде камеры сделайте так.

    //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();
    
  • Построить + Выполнить -> Теперь Перейдите в область «Тусклый свет» и «Снимок», вы должны получить автоматическую вспышку, если устройство поддерживает.

9 голосов
/ 20 января 2015

Android Lollipop представил camera2 API и устарел предыдущий API камеры.Однако использование устаревшего API для включения вспышки по-прежнему работает и намного проще, чем использование нового API.

Кажется, что новый API предназначен для использования в специализированных полнофункциональных приложениях для камер и что его архитекторы этого не сделали.действительно не рассматривают более простые варианты использования, такие как включение фонарика.Чтобы сделать это сейчас, нужно получить CameraManager, создать CaptureSession с фиктивной поверхностью и, наконец, создать и запустить CaptureRequest.Обработка исключений, очистка ресурсов и длинные обратные вызовы включены!

Чтобы узнать, как включить фонарик на Lollipop и новее, взгляните на FlashlightController в проекте AOSP(попробуйте найти новейшие API-интерфейсы, которые были изменены).Не забудьте установить необходимые разрешения.


В Android Marshmallow наконец-то появился простой способ включения вспышки с помощью setTorchMode .

6 голосов
/ 23 октября 2016

Существуют разные способы доступа к Camera Flash в разных версиях Android. Немногие API перестали работать в Lollipop, а затем он снова изменился в Marshmallow. Чтобы преодолеть это, я создал простую библиотеку, которую использовал в нескольких своих проектах, и она дает хорошие результаты. Это все еще не полностью, но вы можете попробовать проверить код и найти недостающие фрагменты. Вот ссылка - NoobCameraFlash .

Если вы просто хотите интегрироваться в ваш код, вы можете использовать для этого gradle. Вот инструкция (взято прямо из Readme) -

Шаг 1. Добавьте репозиторий JitPack в ваш файл сборки. Добавьте его в свой корневой build.gradle в конце репозитория:

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

Шаг 2. Добавьте зависимость

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

Использование

Инициализировать NoobCameraManager синглтон.

NoobCameraManager.getInstance().init(this);

При желании вы можете установить уровень ведения журнала для отладки. В журнале используется библиотека LumberJack . LogLevel по умолчанию: LogLevel.None

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

После этого вам просто нужно позвонить в одноэлементную камеру, чтобы включить или выключить вспышку камеры.

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

Вы должны позаботиться о разрешениях во время выполнения для доступа к камере. перед инициализацией NoobCameraManager. В версии 0.1.2 или раньше мы использовали для поддержки разрешений непосредственно из библиотека, но из-за зависимости от объекта Activity, мы должны удали его.

Flash тоже легко переключать

if(NoobCameraManager.getInstance().isFlashOn()){
    NoobCameraManager.getInstance().turnOffFlash();
}else{
    NoobCameraManager.getInstance().turnOnFlash();
}
6 голосов
/ 06 декабря 2015

Полный код для приложения Android Flashlight

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 голосов
/ 04 июля 2016

В Marshmallow и более поздних версиях CameraManager `setTorchMode () ', кажется, ответ.Это работает для меня:

 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 голосов
/ 04 сентября 2014

Я реализовал эту функцию в своем приложении через фрагменты, используя SurfaceView.Ссылку на этот вопрос stackoverflow и его ответ можно найти здесь

Надеюсь, это поможет:)

0 голосов
/ 28 апреля 2014

Вы также можете использовать следующий код для выключения вспышки.

Camera.Parameters params = mCamera.getParameters()
p.setFlashMode(Parameters.FLASH_MODE_OFF);
mCamera.setParameters(params);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...