打开/关闭手电筒使用SurfaceView [英] Turn ON / OFF Flashlight using SurfaceView

查看:320
本文介绍了打开/关闭手电筒使用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/>

<! - 摄像机权限 - >
<使用-权限的Andr​​oid:名称=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屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆