Як увімкнути програмне світло переднього спалаху в Android?


233

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

Хтось має посилання чи зразок коду?

Відповіді:


401

Для цієї проблеми слід:

  1. Перевірте, чи доступний ліхтарик чи ні?

  2. Якщо так, то вимкнути / увімкнути

  3. Якщо ні, то ви можете робити що завгодно, відповідно до потреб вашого додатка.

Для перевірки наявності спалаху на пристрої:

Ви можете використовувати наступне:

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

що повернеться true, якщо спалах доступний, false якщо ні.

Дивіться:
http://developer.android.com/reference/android/content/pm/PackageManager.html для отримання додаткової інформації.

Для включення / вимкнення ліхтарика:

Я вийшов з Google і зрозумів це про 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" />

Потім скористайтеся камерою та встановіть Camera.Parameters . Основний параметр, який тут використовується, - 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 (Примітка: Це посилання є зараз зламано)

Update6 Ви також можете спробувати додати SurfaceView, як описано в цій відповіді світлодіодним ліхтариком на Galaxy Nexus, керованим яким API? Здається, це рішення, яке працює на багатьох телефонах.

Оновлення 5 Основне оновлення

Я знайшов альтернативне посилання (для зламаних посилань вище): http://www.java2s.com/Open-Source/Android/Tools/quick-settings/com.bwx.bequick.flashlight.htm Тепер ви можете використовувати це посилання. [Оновлення: 14.09.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


2
Дякую за вашу допомогу, це працює для мене! - Я щойно скопіював інтерфейс Flashlight і клас HtcLedFlashlight, тоді я просто викликаю метод setOn з true / false HtcLedFlashlight і це все. --- 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: Ласкаво просимо .. якщо ваша проблема вирішена, позначте цю відповідь вирішеною. щоб вона могла бути корисною іншим ..
Картік Домадія

1
@PolamReddyRajaReddy: Я думаю, ви тестуєте на Samsung Device. Я прав?
Картик Домадія

7
для дозволів правильним кодом у файлі маніфесту є: `<використання-дозволу android: name =" android.permission.CAMERA "/> <використання-дозволу android: name =" android.permission.FLASHLIGHT "/>`
ixeft

1
Також використовуйте: - camera.release ();
Четан

35

З мого досвіду, якщо ваша програма розроблена як для портретної, так і для пейзажної орієнтації, вам потрібно оголосити змінну 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

запропоновані рядки вище не працювали для мене.


Вам не потрібно перевіряти функцію системи, якщо камера вимкнена. Якщо cam! = Null, його було ввімкнено
Грег Енніс

1
Найбільш корисною для мене була частинаyou need to declare the variable cam as static
Алекс Джоліг

При імпорті Cameraкласу AndroidStudio зверніть увагу на android.hardwareклас ...

32

В 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; 
    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; 
            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
Що ви маєте на увазі під "Зазвичай фронтальна камера стоїть на 0"? Як я можу перевірити, що знаходиться спереду, а що ні? До речі, передня камера - це та, яка спрямована на поточного користувача. Зворотна камера - це та, яка, ймовірно, завжди має спалах. І як я можу перевірити, чи спалах увімкнено чи вимкнено?
андроїд розробник

13

Я отримав світло автоматичного спалаху за допомогою простих трьох кроків.

  • Щойно я додав дозвіл на камеру та флеш у файл 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" />
  • У коді камери зробіть це так.

    //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 -> Тепер перейдіть до області затемнення та знімка фотографії, якщо пристрій підтримує, вам слід отримати світло автоматичного спалаху.


9

Android Lollipop представив API2 Camera2 та знецінив попередній API камери. Однак використання застарілого API для включення спалаху все ще працює і набагато простіше, ніж використання нового API.

Схоже, новий API призначений для використання у спеціалізованих повнофункціональних додатках для камер і що його архітектори насправді не розглядали простіші випадки використання, такі як включення ліхтарика. Щоб зробити це зараз, потрібно отримати CameraManager, створити CaptureSession з манекеном Surface і, нарешті, створити і запустити CaptureRequest. Обробка винятків, очищення ресурсів та довгі зворотні дзвінки!

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


Нарешті, Android Marshmallow представив простий спосіб увімкнути спалах за допомогою setTorchMode .


1
Старий API android.hardware.Camera продовжує функціонувати так само, як і раніше, тому немає жодної принципової причини, що потрібно використовувати android.hardware.camera2 для ліхтарика. Можливо, ви можете знизити споживання енергії та завантаження процесора за допомогою камери2, оскільки вам не потрібно тримати активний попередній перегляд, щоб увімкнути ліхтарик.
Едді Талвала

Я спробував одну з найпростіших реалізацій на двох пристроях Lollipop, і він не вмикався спалахом, хоча він працював на всіх декількох пристроях до Lollipop, на яких я його пробував. Можливо, це просто помилка в Lollipop. Якщо старі методи все-таки працюють для вас, і якщо ви не Java-пурист, продовжуйте використовувати старий API, оскільки це набагато простіше :)
LukaCiko

У мене зараз Nexus 5 з Lollipop, і він працює чудово. У мене також є додаток, створене власноруч, що працює і реалізується за допомогою цих методів. У випадку, якщо хтось захоче спробувати. Я поклав посилання на ігровий магазин: play.google.com/store/apps/details?id=com.fadad.linterna Найважливіше, головним чином, добре забезпечити активність або вимкнення камери перед запуском спалаху та дозволів.
ferdiado

Вибачте, моя помилка. Інший додаток, ймовірно, використовував камеру, коли я намагався включити спалах зі старим API. Я оновив відповідь.
LukaCiko

7

Повний код для Android Ліхтарик App

Маніфест

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

  }

якщо спалах вже ввімкнено перед запуском вашого прикладу, то спроба вимкнути спалах не вийде ... у вас є рішення для цієї проблеми?
Тайфун

7

Існують різні способи доступу до камери Flash у різних версіях Android. Мало API перестало працювати в Lollipop, а потім його знову змінили в Marshmallow. Щоб подолати це, я створив просту бібліотеку, яку я використовував у кількох своїх проектах, і це дає хороші результати. Це все ще неповно, але ви можете спробувати перевірити код і знайти відсутні частини. Ось посилання - NoobCameraFlash .

Якщо ви просто хочете інтегруватися у свій код, ви можете використовувати Gradle для цього. Ось інструкції (взяті безпосередньо з Readme) -

Крок 1. Додайте сховище JitPack у файл збірки. Додайте його у свій root 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();
}

Будь ласка, додайте підтримку для використання контексту замість діяльності. Дякую!
Ваджіра Лашанья

@VajiraLasantha Об'єкт Діяльність необхідний для отримання дозволу. Я планував повністю усунути вимогу, якось розділивши дозволи. Тут було відстежено - github.com/Abhi347/NoobCameraFlash/isissue/3 Тим часом ви можете змінити код, щоб видалити вимогу, якщо хочете. Мені може знадобитися певний час, щоб попрацювати над цим.
noob

Так, я це бачив. Я вже змінив вашу конфігурацію для роботи з Context, видаливши матеріали дозволу. Оскільки мій додаток уже перевіряє дозвіл. Будь ласка, повідомте мене, коли ви випустили належну реалізацію, яка підтримує Context. Дякую!
Ваджіра Лашанья

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.
Пратік Бутані

Що робити, якщо на пристрої є кілька спалахів? Деякі мають передню камеру ...
андроїд розробник

0

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

Сподіваюся, це допомагає :)


0

У 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

Спробуйте це.

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

Можна також використовувати наступний код, щоб вимкнути спалах.

Camera.Parameters params = mCamera.getParameters()
p.setFlashMode(Parameters.FLASH_MODE_OFF);
mCamera.setParameters(params);
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.