zoukankan      html  css  js  c++  java
  • android 拍照+拍照button 以及返回按钮布局

    公司最近做一个项目拍照总是崩溃,所以决定自己写一个拍照的方法,在网上调研一番,写了一个简单demo,现共享如下

    主要CameraActivity

    CameraActivity

    package com.wondertek.video.camera;
    
    import java.io.FileOutputStream;
    
    import android.app.Activity;
    import android.hardware.Camera;
    import android.hardware.Camera.AutoFocusCallback;
    import android.hardware.Camera.PictureCallback;
    import android.os.Bundle;
    import android.util.Log;
    import android.view.View;
    import android.view.View.OnClickListener;
    import android.view.WindowManager;
    import android.widget.Button;
    import android.widget.FrameLayout;
    
    import com.wondertek.xsgj.R;
    /**
     * 
    
     * @Description:TODO 拍照优化
    
     * @author:skyCc
    
     * @time:2014-6-6 下午5:03:10
     */
    public class CameraActivity extends Activity {
    
        public static final int CAMERA_RESULT = 1234;
        public static final int REQUEST_PICKER_ALBUM = 2345;
        private static String TAG = "CameraObserver";
        public static String photopath = "";
        Button buttonExit;
        Button buttonCapture;
        private Camera mCamera;
        private CameraViewNew mPreview;
    
        @Override
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            // CameraObserver已经将photopath路径传过来了
            Log.d(TAG, "CameraActivity onCreate photopath = " + photopath);
            getWindow().clearFlags(
                    WindowManager.LayoutParams.FLAG_FORCE_NOT_FULLSCREEN);
            getWindow().addFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN);
            setContentView(R.layout.capture_activity);
            mCamera = getCameraInstance();
            // 创建预览类,并与Camera关联,最后添加到界面布局中
            mPreview = new CameraViewNew(this, mCamera);
            FrameLayout preview = (FrameLayout) findViewById(R.id.camera_preview);
            preview.addView(mPreview);
            // requestWindowFeature(Window.FEATURE_NO_TITLE);// 设置横屏模式以及全屏模式
            // setContentView(new CameraView(this,photopath)); //设置View
            buttonCapture = (Button) findViewById(R.id.button_capture);
            buttonCapture.setOnClickListener(new View.OnClickListener() {
                @Override
                public void onClick(View v) {
                    // TODO Auto-generated method stub
                    mCamera.autoFocus(new AutoFocusCallback() {
                        @Override
                        public void onAutoFocus(boolean success, Camera camera) {
                            // TODO Auto-generated method stub
                            mCamera.takePicture(null, null, myPicture);
    
                        }
                    });
                }
    
            });
            buttonExit=(Button) findViewById(R.id.button_exit);
            buttonExit.setOnClickListener(new OnClickListener() {
                @Override
                public void onClick(View v) {
                    // TODO Auto-generated method stub
                    finish();
                }
            });
        }
    
        /** 打开一个Camera */
        public static Camera getCameraInstance() {
            Camera c = null;
            try {
                c = Camera.open();
            } catch (Exception e) {
                Log.d(TAG, "打开Camera失败失败");
            }
            return c;
        }
    
        private PictureCallback myPicture = new PictureCallback() {
            @Override
            public void onPictureTaken(byte[] data, Camera camera) {
                // TODO Auto-generated method stub
                Log.d(TAG, " onPictureTaken = " + photopath);
                try {
                    if (photopath.length() > 0)
                        data2file(data, photopath);
                } catch (Exception e) {
                }
                camera.stopPreview();
    
            }
    
            private void data2file(byte[] w, String fileName) throws Exception {// 将二进制数据转换为文件的函数
                FileOutputStream out = null;
                try {
                    out = new FileOutputStream(fileName);
                    out.write(w);
                    out.close();
                } catch (Exception e) {
                    if (out != null)
                        out.close();
                    throw e;
                }
            }
        };
    }

    CameraViewNew

    package com.wondertek.video.camera;
    
    import java.io.IOException;
    
    import org.jivesoftware.smack.sasl.SASLMechanism.Success;
    
    import android.content.Context;
    import android.hardware.Camera;
    import android.view.SurfaceHolder;
    import android.view.SurfaceView;
    import android.view.SurfaceHolder.Callback;
    
    /**
    
     * @Description:TODO重新布局拍照的界面
    
     * @author:skyCc
    
     * @time:2014-6-5 下午11:33:11
    
     */
    
    public class CameraViewNew extends SurfaceView implements Callback{
    private final static String TAG="CameraView";
    private Camera mCamera;
    private SurfaceHolder mHolder;
        public CameraViewNew(Context context,Camera camera) {
            super(context);
            mCamera=camera;
            mHolder=getHolder();
            mHolder.addCallback(this);
            mHolder.setType(SurfaceHolder.SURFACE_TYPE_PUSH_BUFFERS);
            // TODO Auto-generated constructor stub
        }
    
        @Override
        public void surfaceChanged(SurfaceHolder holder, int format, int width,
                int height) {
            // TODO Auto-generated method stub
            if(mHolder.getSurface()==null){
                return ;
            }
            mCamera.stopPreview();
            try {
                mCamera.setPreviewDisplay(holder);
                mCamera.startPreview();
            } catch (IOException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }
            
            
        }
    
        @Override
        public void surfaceCreated(SurfaceHolder holder) {
            // TODO Auto-generated method stub
            try {
                mCamera.setPreviewDisplay(holder);
                mCamera.startPreview();
            } catch (IOException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }
            
        }
    
        @Override
        public void surfaceDestroyed(SurfaceHolder holder) {
            // TODO Auto-generated method stub
            mCamera.setPreviewCallback(null);
            mCamera.stopPreview();
            mCamera.release();
            mCamera =null;
        }
    }

    capture_activity.xm

    <?xml version="1.0" encoding="utf-8"?>
     <LinearLayout
          xmlns:android="http://schemas.android.com/apk/res/android"
       android:orientation="horizontal"
         android:layout_width="fill_parent"
         android:layout_height="fill_parent"
         >
        <FrameLayout
         android:id="@+id/camera_preview"
         android:layout_width="fill_parent"
        android:layout_height="fill_parent"
       android:layout_weight="1"
         />
       <Button
        android:id="@+id/button_capture"
         android:text="拍照"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
         android:layout_gravity="center"
        />
       <Button   
            android:text="返回"  
            android:layout_width="wrap_content"  
            android:layout_height="wrap_content"  
            android:id="@+id/button_exit" 
            android:layout_gravity="center" 
        />  
     </LinearLayout>
  • 相关阅读:
    广域网(ppp协议、HDLC协议)
    0120. Triangle (M)
    0589. N-ary Tree Preorder Traversal (E)
    0377. Combination Sum IV (M)
    1074. Number of Submatrices That Sum to Target (H)
    1209. Remove All Adjacent Duplicates in String II (M)
    0509. Fibonacci Number (E)
    0086. Partition List (M)
    0667. Beautiful Arrangement II (M)
    1302. Deepest Leaves Sum (M)
  • 原文地址:https://www.cnblogs.com/cmzcheng/p/3773021.html
Copyright © 2011-2022 走看看