android基础--拍照功能

来源:互联网 发布:array shift php 编辑:程序博客网 时间:2024/05/16 16:22
 

public class MainActivity extends Activity {

       private Camera camera;

       private RelativeLayout buttonlayout;

    public void onCreate(Bundle savedInstanceState) {

        super.onCreate(savedInstanceState);

        requestWindowFeature(Window.FEATURE_NO_TITLE);//设置为没有标题

        getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN, WindowManager.LayoutParams.FLAG_FULLSCREEN);//设置窗口全屏显示

       

        buttonlayout= (RelativeLayout) this.findViewById(R.id.buttonlayout);//找到相对布局(为了让相对布局中的按钮在触摸屏幕后显示)

        Button duijiaoButton= (Button) this.findViewById(R.id.duijiao);//找到对焦按钮

        Button takepictureButton= (Button) this.findViewById(R.id.takepicture);//找到拍照按钮

        setContentView(R.layout.main);

        //要先创建SurfaceView找到控件,才能打开摄像头

        SurfaceView surfaceView = (SurfaceView) this.findViewById(R.id.surfaceView);//得到surfaceView控件

        surfaceView.getHolder().setType(SurfaceHolder.SURFACE_TYPE_PUSH_BUFFERS);//把输送给SurfaceView控件的内容直接输出到画面上

        surfaceView.getHolder().setFixedSize(176, 144);//设置分辨率

       

        surfaceView.getHolder().addCallback(new SurfaceCallback());//设置回调,当SurfaceView被创建的时候调用SurfaceCallback方法

       

        ButtonClickListener listener = new ButtonClickListener();

        takepictureButton.setOnClickListener(listener);

        duijiaoButton.setOnClickListener(listener);

    }

    private final class ButtonClickListener implements View.OnClickListener{

              public void onClick(View v) {

                     if(camera != null){

                            if(v.getId()==R.id.takepicture){//处理拍照按钮

                                   //camera.takePicture(shutter, raw, jpeg)

                                   //shutter:用户摁下快门时候的回调  ;raw:拍下来的照片未经压缩的一个原始数据的回调;jpeg:压缩后的类型

                                   camera.takePicture(null, null, new MyPictureCallback());//前两个参数不需要得到

                                   /*  摄像头在某一时刻只能处理一项工作,现在在拍照片,拍完照片就不会预览了,现在希望拍完后继续预览

                                          camera.startPreview();重新开始预览

                                          但是拍照和预览是异步的,需要在拍照完全结束后才能预览,

                                          所以放到保存完照片以后再在做预览这个操作

                                          在下面MyPictureCallback中设置

                                   */

                                   buttonlayout.setVisibility(ViewGroup.GONE);//拍照结束后把按钮再隐藏掉

                            }else{//处理自动对焦功能

                                   camera.autoFocus(null);//对焦

                            }

                     }

              }

           private final class MyPictureCallback implements PictureCallback{

                     public void onPictureTaken(byte[] data, Camera camera) {

                            try {

                                   File file = new File(Environment.getExternalStorageDirectory(),System.currentTimeMillis()+".jpg");

                                   FileOutputStream outputStream = new FileOutputStream(file);

                                   outputStream.write(data);

                                   outputStream.close();

                                   camera.startPreview();//在这里设置重新开始预览

                            } catch (Exception e) {

                                   e.printStackTrace();

                            }

                     }

           }

    }

    //触摸屏幕时要显示 对焦和拍照两个按钮,这里重写onTouchEvent方法来实现。为了一开始不显示这两个按钮,要在main.xml中设置visibility="gone"来隐藏按钮

       public boolean onTouchEvent(MotionEvent event) {

              if(event.getAction() == MotionEvent.ACTION_DOWN){//触摸事件为摁下

                     buttonlayout.setVisibility(ViewGroup.VISIBLE);//让按钮显示

              }

              return super.onTouchEvent(event);

       }

 

       //回调函数

    private final class SurfaceCallback implements Callback{

              public void surfaceCreated(SurfaceHolder holder) {

                     try {

                            camera = Camera.open();//打开摄像头,一个摄像头在同一时刻只能被一个应用使用

                            Parameters parameters = camera.getParameters();//构建一个参数对象

                            //某些设备只允许设置它清单中的值,不允许随意设置值,比如HTC的手机摄像头规定了照片大小。所以用Log来看下设备允许的参数值

                            Log.i("MainActivity",parameters.flatten());//往控制台输出可以使用的各项参数和各项参数可以使用的值,根据参数和对应的值进行设置

                            parameters.setPreviewSize(800, 480);//设置预览图片大小

                            parameters.setPreviewFrameRate(5);//每秒钟从摄像头捕获画面的个数

                            parameters.setPictureSize(640, 480);//照片大小

                            parameters.setPreviewFormat(ImageFormat.JPEG);//设置照片格式为JPG

                            camera.setParameters(parameters);//把参数对象设给照相机

                            //设置需要哪个SurfaceView来显示摄像头所捕获的画面

                            camera.setPreviewDisplay(holder);

                            camera.startPreview();//把预览的画面显示在屏幕上,开始预览

                     } catch (IOException e) {

                            e.printStackTrace();

                     }

              }

              public void surfaceChanged(SurfaceHolder holder, int format, int width,

                            int height) {

                    

              }

              public void surfaceDestroyed(SurfaceHolder holder) {

                     if(camera!=null)

                            camera.release();//当MainActivity 离开前台,要释放掉摄像头

                     camera = null;

              }

    }

}

要加三个权限:

<!-- 设置摄像头的访问权限 -->

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

    <!-- 在SDCard中创建与删除文件权限 -->

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

    <!-- 往SDCard写入数据权限 -->

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

原创粉丝点击