打开/关闭手电筒使用SurfaceView [英] Turn ON / OFF Flashlight using SurfaceView
问题描述
我写一个Android摄像头应用程序,并试图实现的Flash功能,我使用SurfaceView,每当我做轻按闪光灯按钮切换工作,但闪光灯不来......看我下面的$ C $词都用来开启/关闭手电筒。
完成code: -
@覆盖
公共无效的onCreate(包savedInstanceState){
super.onCreate(savedInstanceState);
的setContentView(R.layout.activity_camera);
preVIEW =(SurfaceView)findViewById(R.id.surface);
previewHolder = preview.getHolder();
previewHolder.addCallback(surfaceCallback);
previewHolder.setType(SurfaceHolder.SURFACE_TYPE_PUSH_BUFFERS);
previewHolder.setFixedSize(getWindow()。getWindowManager()
.getDefaultDisplay()。的getWidth(),getWindow()。getWindowManager()
.getDefaultDisplay()的getHeight())。
btnFlash =(的ImageButton)findViewById(R.id.btnFlash);
/ *
*首先检查设备是否支持手电筒或不
* /
hasFlash = getApplicationContext()。getPackageManager()
.hasSystemFeature(PackageManager.FEATURE_CAMERA_FLASH);
如果(!hasFlash){
//设备不支持Flash
//显示警告信息并关闭应用程序
AlertDialog警报=新AlertDialog.Builder(CameraLauncherActivity.this)
。创建();
alert.setTitle(错误);
alert.setMessage(对不起,您的设备不支持闪光灯!);
alert.setButton(OK,新DialogInterface.OnClickListener(){
公共无效的onClick(DialogInterface对话,诠释它){
//关闭应用程序
完();
}
});
alert.show();
返回;
}
//显示按钮图像
toggleButtonImage();
btnFlash.setOnClickListener(新View.OnClickListener(){
@覆盖
公共无效的onClick(视图v){
如果(isFlashOn){
//关闭闪光
turnOffFlash();
} 其他 {
//打开闪光
turnOnFlash();
}
}
});
}
/ *
*打开闪光
* /
私人无效turnOnFlash(){
如果(!isFlashOn){
如果(相机== NULL || PARAMS == NULL){
返回;
}
PARAMS = camera.getParameters();
params.setFlashMode(Parameters.FLASH_MODE_ON);
camera.setParameters(PARAMS);
isFlashOn = TRUE;
//改变按键/开关图像
toggleButtonImage();
}
}
/ *
*关闭闪光灯
* /
私人无效turnOffFlash(){
如果(isFlashOn){
如果(相机== NULL || PARAMS == NULL){
返回;
}
PARAMS = camera.getParameters();
params.setFlashMode(Parameters.FLASH_MODE_OFF);
camera.setParameters(PARAMS);
isFlashOn = FALSE;
//改变按键/开关图像
toggleButtonImage();
}
}
/ *
*拨动开关按钮图像
*改变图像状态开/关
* * /
私人无效toggleButtonImage(){
如果(isFlashOn){
btnFlash.setImageResource(R.drawable.green_button);
}其他{
btnFlash.setImageResource(R.drawable.red_button);
}
}
@覆盖
公共无效onResume(){
super.onResume();
相机= Camera.open();
}
@覆盖
公共无效的onPause(){
super.onPause();
如果(在preVIEW){
camera.stop preVIEW(); }
camera.release();
摄像头= NULL;
在preVIEW = FALSE;
}
私人Camera.Size getBest previewSize(INT宽度,高度INT,Camera.Parameters参数){
Camera.Size结果= NULL;
对于(Camera.Size大小:parameters.getSupported previewSizes())
{
如果(size.width< =宽度放大器;&安培; size.height< =身高)
{
如果(结果== NULL){
结果=大小;
} 其他 {
INT resultArea = result.width * result.height;
INT newArea = size.width * size.height;
如果(newArea> resultArea){
结果=大小;
}
}
}
}
返回(结果);
}
SurfaceHolder.Callback surfaceCallback =新SurfaceHolder.Callback(){
公共无效surfaceCreated(SurfaceHolder持有者){
尝试 {
camera.set previewDisplay(previewHolder);
}赶上(的Throwable T){
Log.e(previewDemo-surfaceCallback
异常的一套previewDisplay(),T);
Toast.makeText(CameraLauncherActivity.this,t.getMessage(),Toast.LENGTH_LONG).show();
}
}
公共无效surfaceChanged(SurfaceHolder持有人,INT格式,诠释的宽度,高度INT){
PARAMS = camera.getParameters();
params.setFlashMode(Camera.Parameters.FLASH_MODE_ON);
Camera.Size大小= getBest previewSize(宽度,高度,
PARAMS);
如果(大小!= NULL){
params.set previewSize(size.width,size.height);
camera.setParameters(PARAMS);
camera.start preVIEW();
在preVIEW = TRUE;
ZoomControls zoomControls =(ZoomControls)findViewById(R.id.zoomControls);
如果(params.isZoomSupported()){
最终诠释maxZoomLevel = params.getMaxZoom();
Log.i(最大缩放,是+ maxZoomLevel);
zoomControls.setIsZoomInEnabled(真正的);
zoomControls.setIsZoomOutEnabled(真正的);
zoomControls.setOnZoomInClickListener(新OnClickListener(){
公共无效的onClick(视图v){
如果(currentZoomLevel< maxZoomLevel){
currentZoomLevel ++;
//mCamera.startSmoothZoom(currentZoomLevel);
params.setZoom(currentZoomLevel);
camera.setParameters(PARAMS);
}
}
});
zoomControls.setOnZoomOutClickListener(新OnClickListener(){
公共无效的onClick(视图v){
如果(currentZoomLevel大于0){
currentZoomLevel--;
params.setZoom(currentZoomLevel);
camera.setParameters(PARAMS);
}
}
});
}
其他
zoomControls.setVisibility(View.GONE);
}
}
公共无效surfaceDestroyed(SurfaceHolder持有者){
}
};
}
几件事我能想到的:
记住要添加的特性和要求的清单了摄像头的应用程序:
<! - 相机要求 - >
<使用特征的android:NAME =android.hardware.camera/>
<! - 摄像机权限 - >
<使用-权限的Android:名称=android.permission.CAMERA/>
<! - 特点 - >
<使用特征的android:NAME =android.hardware.camera.flash/>
<使用特征的android:NAME =android.hardware.camera.autofocus/>
如果你想使用它作为手电筒,你可以做什么@yoah说:
parameters.setFlashMode(Camera.Parameters.FLASH_MODE_TORCH)
如果没有,打开闪光灯,这将出来,当你拍照,你使用:
parameters.setFlashMode(Camera.Parameters.FLASH_MODE_ON)
我最近写了一个自定义的相机应用,但还没有上传到Github的是,它拥有所有工作的基本功能。
I am writing an Android Camera App and trying to implement Flash functionality, I am using SurfaceView, whenever i do tap on flash button toggle works but flash not coming... see my below code i have used to Turn ON/OFF Flashlights.
Complete code:--
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_camera);
preview=(SurfaceView)findViewById(R.id.surface);
previewHolder=preview.getHolder();
previewHolder.addCallback(surfaceCallback);
previewHolder.setType(SurfaceHolder.SURFACE_TYPE_PUSH_BUFFERS);
previewHolder.setFixedSize(getWindow().getWindowManager()
.getDefaultDisplay().getWidth(), getWindow().getWindowManager()
.getDefaultDisplay().getHeight());
btnFlash = (ImageButton) findViewById(R.id.btnFlash);
/*
* First check if device is supporting flashlight or not
*/
hasFlash = getApplicationContext().getPackageManager()
.hasSystemFeature(PackageManager.FEATURE_CAMERA_FLASH);
if (!hasFlash) {
// device doesn't support flash
// Show alert message and close the application
AlertDialog alert = new AlertDialog.Builder(CameraLauncherActivity.this)
.create();
alert.setTitle("Error");
alert.setMessage("Sorry, your device doesn't support flash light!");
alert.setButton("OK", new DialogInterface.OnClickListener() {
public void onClick(DialogInterface dialog, int which) {
// closing the application
finish();
}
});
alert.show();
return;
}
// displaying button image
toggleButtonImage();
btnFlash.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
if (isFlashOn) {
// turn off flash
turnOffFlash();
} else {
// turn on flash
turnOnFlash();
}
}
});
}
/*
* Turning On flash
*/
private void turnOnFlash() {
if (!isFlashOn) {
if (camera == null || params == null) {
return;
}
params = camera.getParameters();
params.setFlashMode(Parameters.FLASH_MODE_ON);
camera.setParameters(params);
isFlashOn = true;
// changing button/switch image
toggleButtonImage();
}
}
/*
* Turning Off flash
*/
private void turnOffFlash() {
if (isFlashOn) {
if (camera == null || params == null) {
return;
}
params = camera.getParameters();
params.setFlashMode(Parameters.FLASH_MODE_OFF);
camera.setParameters(params);
isFlashOn = false;
// changing button/switch image
toggleButtonImage();
}
}
/*
* Toggle switch button images
* changing image states to on / off
* */
private void toggleButtonImage(){
if(isFlashOn){
btnFlash.setImageResource(R.drawable.green_button);
}else{
btnFlash.setImageResource(R.drawable.red_button);
}
}
@Override
public void onResume() {
super.onResume();
camera=Camera.open();
}
@Override
public void onPause() {
super.onPause();
if (inPreview) {
camera.stopPreview(); }
camera.release();
camera=null;
inPreview=false;
}
private Camera.Size getBestPreviewSize(int width, int height,Camera.Parameters parameters){
Camera.Size result=null;
for (Camera.Size size : parameters.getSupportedPreviewSizes())
{
if (size.width<=width && size.height<=height)
{
if (result==null) {
result=size;
} else {
int resultArea=result.width*result.height;
int newArea=size.width*size.height;
if (newArea>resultArea) {
result=size;
}
}
}
}
return(result);
}
SurfaceHolder.Callback surfaceCallback=new SurfaceHolder.Callback(){
public void surfaceCreated(SurfaceHolder holder) {
try {
camera.setPreviewDisplay(previewHolder);
} catch (Throwable t) {
Log.e("PreviewDemo-surfaceCallback",
"Exception in setPreviewDisplay()", t);
Toast.makeText(CameraLauncherActivity.this, t.getMessage(), Toast.LENGTH_LONG).show();
}
}
public void surfaceChanged(SurfaceHolder holder,int format, int width,int height) {
params = camera.getParameters();
params.setFlashMode(Camera.Parameters.FLASH_MODE_ON);
Camera.Size size=getBestPreviewSize(width, height,
params);
if (size!=null) {
params.setPreviewSize(size.width, size.height);
camera.setParameters(params);
camera.startPreview();
inPreview=true;
ZoomControls zoomControls = (ZoomControls) findViewById(R.id.zoomControls);
if (params.isZoomSupported()) {
final int maxZoomLevel = params.getMaxZoom();
Log.i("max ZOOM ", "is " + maxZoomLevel);
zoomControls.setIsZoomInEnabled(true);
zoomControls.setIsZoomOutEnabled(true);
zoomControls.setOnZoomInClickListener(new OnClickListener(){
public void onClick(View v){
if(currentZoomLevel < maxZoomLevel){
currentZoomLevel++;
//mCamera.startSmoothZoom(currentZoomLevel);
params.setZoom(currentZoomLevel);
camera.setParameters(params);
}
}
});
zoomControls.setOnZoomOutClickListener(new OnClickListener(){
public void onClick(View v){
if(currentZoomLevel > 0){
currentZoomLevel--;
params.setZoom(currentZoomLevel);
camera.setParameters(params);
}
}
});
}
else
zoomControls.setVisibility(View.GONE);
}
}
public void surfaceDestroyed(SurfaceHolder holder) {
}
};
}
A few things I can think of:
Remember to add the features and requirements on the manifest for a camera app:
<!-- Camera Requirement -->
<uses-feature android:name="android.hardware.camera" />
<!-- Camera Permissions -->
<uses-permission android:name="android.permission.CAMERA" />
<!-- Features -->
<uses-feature android:name="android.hardware.camera.flash" />
<uses-feature android:name="android.hardware.camera.autofocus" />
If you want to use it as flashlight you can do what @yoah said:
parameters.setFlashMode(Camera.Parameters.FLASH_MODE_TORCH)
If not, to turn flash on which will come out when you take the picture, you use:
parameters.setFlashMode(Camera.Parameters.FLASH_MODE_ON)
I wrote a custom camera app recently, but haven't uploaded it to Github yet, it has all the basic functions working.
这篇关于打开/关闭手电筒使用SurfaceView的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!