我想在Android中以编程方式打开前闪光灯(不是相机预览)。我在谷歌上搜索了一下,但我找到的帮助把我转到了这个页面
有人有链接或示例代码吗?
我想在Android中以编程方式打开前闪光灯(不是相机预览)。我在谷歌上搜索了一下,但我找到的帮助把我转到了这个页面
有人有链接或示例代码吗?
当前回答
在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);
其他回答
2021年,有了CameraX,现在非常简单:https://stackoverflow.com/a/66585201/294884
对于这个问题,你应该:
检查手电筒是否亮 是否可用? 如果是,那么关闭/打开 如果没有,你可以根据你的应用程序做任何事情 的需求。
检查设备flash可用性:
你可以使用以下方法:
context.getPackageManager().hasSystemFeature(PackageManager.FEATURE_CAMERA_FLASH);
如果flash可用,则返回true,否则返回false。
更多信息请参见:http://developer.android.com/reference/android/content/pm/PackageManager.html。
用于打开/关闭手电筒:
我谷歌了一下,找到了这个关于安卓,许可,手电筒。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,设置Camera. parameters。这里使用的主要参数是FLASH_MODE_TORCH。
eg.
打开相机手电筒的代码片段。
Camera cam = Camera.open();
Parameters p = cam.getParameters();
p.setFlashMode(Parameters.FLASH_MODE_TORCH);
cam.setParameters(p);
cam.startPreview();
代码片段关闭相机led灯。
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 你也可以尝试在Galaxy Nexus上添加一个SurfaceView,通过什么API控制LED手电筒? 这似乎是一种适用于许多手机的解决方案。
更新5重要更新
我找到了一个替代链接(上面的坏链接):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
示例说明如何开启摩托罗拉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强度吗?完整的文章。请注意,只有根HTC设备支持此功能。
* *问题:* *
在打开/关闭手电筒时也有一些问题。如。对于没有FLASH_MODE_TORCH的设备,或者即使有FLASH_MODE_TORCH,那么手电筒不打开等。
三星通常会制造很多问题。
你可以参考下面列出的问题:
在Android中使用相机手电筒
在三星Galaxy Ace 2.2.1和Galaxy Tab中打开/关闭相机LED/闪光灯
在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);
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();
}
}
}
我已经在我的应用程序中通过使用SurfaceView的片段实现了这个功能。这个stackoverflow问题的链接和答案可以在这里找到
希望这对你有所帮助。
根据我的经验,如果你的应用程序设计为纵向和横向工作,你需要声明变量凸轮为静态。否则,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
上面建议的台词对我不起作用。