如何在Android中以编程方式打开前置闪光灯?

sai*_*ket 225 android android-camera

我想在Android中以编程方式打开前闪光灯(不是使用相机预览).我用谷歌搜索了它,但我发现的帮助将我推荐到了这个页面

有没有人有任何链接或示例代码?

Kar*_*iya 392

对于这个问题,你应该:

  1. 检查手电筒是否可用?

  2. 如果是,则关闭/打开

  3. 如果没有,那么你可以根据你的应用需求做任何事情.

检查设备中闪存的可用性:

您可以使用以下内容:

 context.getPackageManager().hasSystemFeature(PackageManager.FEATURE_CAMERA_FLASH);
Run Code Online (Sandbox Code Playgroud)

如果闪存可用则返回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" />
Run Code Online (Sandbox Code Playgroud)

然后使用Camera并设置Camera.Parameters.这里使用的主要参数是FLASH_MODE_TORCH.

例如.

代码片段打开相机手电筒.

Camera cam = Camera.open();     
Parameters p = cam.getParameters();
p.setFlashMode(Parameters.FLASH_MODE_TORCH);
cam.setParameters(p);
cam.startPreview();
Run Code Online (Sandbox Code Playgroud)

代码片段可关闭相机指示灯.

  cam.stopPreview();
  cam.release();
Run Code Online (Sandbox Code Playgroud)

我刚刚找到了一个使用此权限的项目.检查quick-settings的src代码.这里http://code.google.com/p/quick-settings/(注意:此链接现已中断)

对于Flashlight,请直接查看 http://code.google.com/p/quick-settings/source/browse/trunk/quick-settings/#quick-settings/src/com/bwx/bequick/flashlight(注意:此链接为现在坏了)

Update6 您还可以尝试添加一个SurfaceView,如本答案LED手电筒中描述的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上启用LED:http://code.google.com/p/droidled/

另一个开源代码:

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

更新3(用于打开/关闭相机的小工具)

如果你想开发一个打开/关闭你的相机led的小部件,那么你必须参考我的答案 小工具来打开/关闭Android中的相机手电筒 ..

更新4

如果你想设置从摄像头LED出现的光强度你可以参考我可以改变Android设备的LED强度吗?全职.请注意,只有root的HTC设备才支持此功能.

**问题:**

打开/关闭手电筒时也存在一些问题.例如.对于没有FLASH_MODE_TORCH或甚至没有的设备,手电筒不会打开等.

通常,三星会产生很多问题.

您可以参考以下列表中的问题:

在Android中使用相机手电筒

打开/关闭Samsung Galaxy Ace 2.2.1和Galaxy Tab中的相机LED /闪光灯

  • 对于权限,清单文件中的正确代码是:`<uses-permission android:name ="android.permission.CAMERA"/> <uses-permission android:name ="android.permission.FLASHLIGHT"/>` (6认同)
  • 大多数链接都不起作用.:) (5认同)
  • 谢谢你的帮助,它对我有用! - 我刚刚复制了界面Flashlight和HtcLedFlashlight类,然后我只用真/假HtcLedFlashlight调用setOn方法.---界面 - 手电筒http://code.google.com/p/quick-settings/source/browse/trunk/quick-settings/src/com/bwx/bequick/flashlight/Flashlight.java - Class-HtcLedFlashlight http://code.google.com/p/quick-settings/source/browse/trunk/quick-settings/src/com/bwx/bequick/flashlight/HtcLedFlashlight.java (2认同)
  • @saiket:欢迎……如果您的问题已解决,则将此答案标记为已解决。以便它可以对其他人有用.. (2认同)

小智 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();
    }
}
}
Run Code Online (Sandbox Code Playgroud)

显示我不得不把这条线

    <uses-permission android:name="android.permission.CAMERA" />
Run Code Online (Sandbox Code Playgroud)

来自http://developer.android.com/reference/android/hardware/Camera.html

上面建议的行不适合我.


Jac*_*per 25

在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();
    }
}
Run Code Online (Sandbox Code Playgroud)

关闭代码

camManager.setTorchMode(cameraId, false);
Run Code Online (Sandbox Code Playgroud)

和权限

<uses-permission android:name="android.permission.CAMERA"/>
<uses-permission android:name="android.permission.FLASHLIGHT"/>
Run Code Online (Sandbox Code Playgroud)

其他编辑

人们仍然赞同我的回答所以我决定发布额外的代码这是我当天回答问题的解决方案:

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();
    }
}
}
Run Code Online (Sandbox Code Playgroud)

  • “前置摄像头通常位于0位置”是什么意思?如何检查哪个在前面?顺便说一句,前置摄像头是针对当前用户的。背面摄像头可能总是带有闪光灯。以及如何检查闪光灯是打开还是关闭? (2认同)

swi*_*Boy 13

我通过以下简单的三步获得了AutoFlash灯.

  • 我刚在Manifest.xml文件中添加了Camera和Flash Permission
<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" />
Run Code Online (Sandbox Code Playgroud)
  • 在你的相机代码中这样做.

    //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();
    
    Run Code Online (Sandbox Code Playgroud)
  • Build + Run - >现在转到昏暗的灯光区域和Snap照片,如果设备支持,你应该获得自动闪光灯.


Luk*_*iko 9

Android Lollipop推出了camera2 API,并弃用了之前的相机API.但是,使用已弃用的API打开闪存仍然有效,并且比使用新API简单得多.

似乎新的API旨在用于专用的全功能相机应用程序,并且其架构师并没有真正考虑更简单的用例,例如打开手电筒.要做到这一点,必须得到一个CameraManager,创建一个带有虚拟Surface的CaptureSession,最后创建并启动一个CaptureRequest.包括异常处理,资源清理和长回调!

要了解如何在Lollipop和更新版本上更换手电筒,请查看AOSP项目中的FlashlightController(尝试查找最新的已修改的旧版API).不要忘记设置所需的权限.


Android Marshmallow终于推出了一种用setTorchMode打开flash的简单方法.


RAP*_*RAP 6

完整的Android手电筒应用程序代码

表现

  <?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>
Run Code Online (Sandbox Code Playgroud)

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>
Run Code Online (Sandbox Code Playgroud)

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

  }
Run Code Online (Sandbox Code Playgroud)


noo*_*oob 6

在不同的Android版本中有不同的方式访问Camera Flash.很少有API在Lollipop停止工作,然后在Marshmallow再次更改.为了解决这个问题,我创建了一个简单的库,我在我的一些项目中使用它并且它给出了很好的结果.它仍然不完整,但您可以尝试检查代码并找到缺失的部分.这是链接 - NoobCameraFlash.

如果您只想集成代码,可以使用gradle.这是说明(直接来自自述文件) -

步骤1.将JitPack存储库添加到构建文件中.将其添加到存储库末尾的根build.gradle中:

allprojects {
        repositories {
            ...
            maven { url "https://jitpack.io" }
        }
}
Run Code Online (Sandbox Code Playgroud)

步骤2.添加依赖项

dependencies {
        compile 'com.github.Abhi347:NoobCameraFlash:0.0.1'
  }
Run Code Online (Sandbox Code Playgroud)

用法

初始化NoobCameraManager单身人士.

NoobCameraManager.getInstance().init(this);
Run Code Online (Sandbox Code Playgroud)

您可以选择设置调试日志记录的日志级别.日志记录使用LumberJack库.默认的LogLevel是LogLevel.None

NoobCameraManager.getInstance().init(this, LogLevel.Verbose);
Run Code Online (Sandbox Code Playgroud)

之后你只需要打电话给单身人士打开或关闭相机闪光灯.

NoobCameraManager.getInstance().turnOnFlash();
NoobCameraManager.getInstance().turnOffFlash();
Run Code Online (Sandbox Code Playgroud)

在初始化NoobCameraManager之前,您必须自己处理运行时权限以自行访问Camera.在0.1.2或更早版本中,我们曾经直接从库中提供对权限的支持,但由于依赖于Activity对象,我们必须将其删除.

也很容易切换Flash

if(NoobCameraManager.getInstance().isFlashOn()){
    NoobCameraManager.getInstance().turnOffFlash();
}else{
    NoobCameraManager.getInstance().turnOnFlash();
}
Run Code Online (Sandbox Code Playgroud)


归档时间:

查看次数:

322953 次

最近记录:

5 年,10 月 前