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

我想在Android中以编程方式打开相机闪光灯(不带相机预览)。 我GOOGLE了,但我发现的帮助引荐我到这个网页

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

为此,你应该这样做:

  1. 检查闪光灯是否可用?

  2. 如果是,则closures/打开

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

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

您可以使用以下内容

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

如果闪光灯可用则返回true,否则返回false。

有关更多信息,请参阅http://developer.android.com/reference/android/content/pm/PackageManager.html

打开/closures手电筒:

我googled了,并得到了关于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 。

例如。

Code Snippet打开相机闪光灯。

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

代码片断closures相机的LED灯。

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

我刚刚find了一个使用此权限的项目。 检查快速设置的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控制吗? 这似乎是解决scheme,适用于许多手机。

更新5主要更新

我find了替代链接(对于上面的断开链接): http : //www.java2s.com/Open-Source/Android/Tools/quick-settings/com.bwx.bequick.flashlight.htm现在可以使用此链接。 [更新:14/9/2012这个链接现在被打破]

更新1

另一个开源代码: 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(用于开启/closures摄像头的Widget)

如果你想开发一个小部件,打开/closures你的相机led,那么你必须参考我的答案小工具在android中打开/closures相机手电筒 。

更新4

如果你想设置从相机LED出现的光的强度,你可以参考我可以改变Android设备的LED亮度? 完整的post..请注意,只有扎根HTC设备支持此function。

问题:

打开/closures手电筒时也有一些问题。 例如。 对于没有FLASH_MODE_TORCH的设备,即使有,手电筒也不会打开等。

通常三星创造了很多问题。

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

在Android中使用相机手电筒

在Samsung Galaxy Ace 2.2.1&Galaxy Tab中打开/closures相机LED /闪光灯

根据我的经验,如果您的应用程序devise为以纵向和横向方向工作,则需要将可变cam声明为静态。 否则,在切换方向时调用的onDestroy()会销毁它,但不会释放Camera,因此无法重新打开它。

 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

上面的提示行并不适合我。

我有以下简单的三步自动闪光灯。

  • 我只是在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" /> 
  • 在你的相机代码这样做。

     //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 – >现在进入昏暗的灯光区域和捕捉照片,如果设备支持,你应该得到自动闪光。

Android Lollipop引入了camera2 API,并弃用了以前的相机API。 但是,使用不推荐使用的API来打开闪存仍然有效,比使用新的API简单得多。

看来,新的API是专门用于全function的相机应用程序,其架构师并没有真正考虑简单的使用情况,如打开手电筒。 要做到这一点,必须得到一个CameraManager,创build一个虚拟Surface的CaptureSession,最后创build并启动一个CaptureRequest。 包括exception处理,资源清理和长callback

要了解如何打开Lollipop和更新的手电筒,请查看AOSP项目中的FlashlightController (尝试find最新的,作为已被修改的旧API)。 不要忘记设置所需的权限。


Android Marshmallow终于推出了一个简单的方法来用setTorchMode打开flash。

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

closures代码

 camManager.setTorchMode(cameraId, false); 

和权限

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

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

performance

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

在不同的Android版本中访问Camera Flash有不同的方法。 几乎没有什么API停止在棒棒糖工作,然后它又变成了棉花糖。 为了克服这个问题,我创build了一个简单的图书馆,这个图书馆在我的项目中很less使用,而且效果很好。 它仍然是不完整的,但你可以尝试检查代码,find缺失的部分。 这是链接 – NoobCameraFlash 。

如果你只想集成在你的代码中,你可以使用gradle来实现。 这里的说明(直接从自述文件中获取) –

第1步。将JitPack存储库添加到您的构build文件。 将其添加到您的根build.gradle存储库的末尾:

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

第2步。添加依赖关系

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

用法

初始化NoobCameraManager单例。

 NoobCameraManager.getInstance().init(this); 

您可以select设置debugging日志logging的日志级别。 日志logging使用LumberJack库。 默认的LogLevel是LogLevel.None

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

之后,你只需要打电话给单身打开或closures相机闪光灯。

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

您可以自己照顾运行时权限以访问Camera,或者可以让图书馆为您执行此操作

 NoobCameraManager.getInstance().takePermissions(); 

也很容易切换Flash

 if(NoobCameraManager.getInstance().isFlashOn()){ NoobCameraManager.getInstance().turnOffFlash(); }else{ NoobCameraManager.getInstance().turnOnFlash(); } 

我已经在我的应用程序中通过使用SurfaceView的碎片实现了这个function。 链接到这个计算器的问题和答案可以在这里find

希望这可以帮助 :)

在棉花糖和以上,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); 

当我更新我的SDK版本的相机闪光灯退出工作与空指针exception。 我发现我必须在build.gradle中将targetSDKVersion设置为22当我尝试23时,应用程序崩溃。

  targetSdkVersion 22 

您也可以使用以下代码closures闪光灯。

 Camera.Parameters params = mCamera.getParameters() p.setFlashMode(Parameters.FLASH_MODE_OFF); mCamera.setParameters(params);