• Android实现手机拍照功能


    一、布局文件main.xml

    <?xml version="1.0" encoding="utf-8"?>
    <FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
        android:layout_width="fill_parent"
        android:layout_height="fill_parent" >
    
        <SurfaceView
            android:id="@+id/surfaceView"
            android:layout_width="fill_parent"
            android:layout_height="fill_parent" />
    
        <RelativeLayout
            android:id="@+id/buttonlayout"
            android:layout_width="fill_parent"
            android:layout_height="fill_parent"
            android:visibility="gone" >
    
            <Button
                android:id="@+id/takepicture"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:layout_alignParentBottom="true"
                android:layout_alignParentRight="true"
                android:layout_marginRight="5dp"
                android:onClick="takepicture"
                android:text="@string/takepicture" />
    
            <Button
                android:id="@+id/autofocus"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:layout_alignTop="@id/takepicture"
                android:layout_marginRight="20dp"
                android:layout_toLeftOf="@id/takepicture"
                android:onClick="takepicture"
                android:text="@string/autofocus" />
        </RelativeLayout>
    
    </FrameLayout>

    二、MainActivity.java

    import java.io.File;
    import java.io.FileOutputStream;
    
    import android.app.Activity;
    import android.hardware.Camera;
    import android.hardware.Camera.PictureCallback;
    import android.os.Bundle;
    import android.os.Environment;
    import android.view.MotionEvent;
    import android.view.SurfaceHolder;
    import android.view.SurfaceHolder.Callback;
    import android.view.SurfaceView;
    import android.view.View;
    import android.view.ViewGroup;
    import android.view.Window;
    import android.view.WindowManager;
    
    public class MainActivity extends Activity {
        private View layout;
        private Camera camera;
    
        @Override
        public void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            requestWindowFeature(Window.FEATURE_NO_TITLE);
            getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN,
                    WindowManager.LayoutParams.FLAG_FULLSCREEN);
            setContentView(R.layout.main);
    
            layout = this.findViewById(R.id.buttonlayout);
    
            SurfaceView surfaceView = (SurfaceView) this
                    .findViewById(R.id.surfaceView);
            surfaceView.getHolder()
                    .setType(SurfaceHolder.SURFACE_TYPE_PUSH_BUFFERS);
            surfaceView.getHolder().setFixedSize(176, 144);
            surfaceView.getHolder().setKeepScreenOn(true);
            surfaceView.getHolder().addCallback(new SurfaceCallback());
        }
    
        public void takepicture(View v) {
            if (camera != null) {
                switch (v.getId()) {
                case R.id.takepicture:
                    camera.takePicture(null, null, new MyPictureCallback());
                    break;
    
                case R.id.autofocus:
                    camera.autoFocus(null);
                    break;
                }
            }
        }
    
        private final class MyPictureCallback implements PictureCallback {
            public void onPictureTaken(byte[] data, Camera camera) {
                try {
                    File jpgFile = new File(
                            Environment.getExternalStorageDirectory(),
                            System.currentTimeMillis() + ".jpg");
                    FileOutputStream outStream = new FileOutputStream(jpgFile);
                    outStream.write(data);
                    outStream.close();
                    camera.startPreview();
                } catch (Exception e) {
                    e.printStackTrace();
                }
            }
    
        }
    
        private final class SurfaceCallback implements Callback {
            public void surfaceCreated(SurfaceHolder holder) {
                try {
                    camera = Camera.open();// 打开摄像头
                    Camera.Parameters parameters = camera.getParameters();
                    // Log.i("MainActivity", parameters.flatten());
                    parameters.setPreviewSize(800, 480);
                    parameters.setPreviewFrameRate(5);
                    parameters.setPictureSize(1024, 768);
                    parameters.setJpegQuality(80);
                    camera.setParameters(parameters);
                    camera.setPreviewDisplay(holder);
                    camera.startPreview();// 開始预览
                } catch (Exception e) {
                    e.printStackTrace();
                }
            }
    
            public void surfaceChanged(SurfaceHolder holder, int format, int width,
                    int height) {
            }
    
            public void surfaceDestroyed(SurfaceHolder holder) {
                if (camera != null) {
                    camera.release();
                    camera = null;
                }
            }
    
        }
    
        @Override
        public boolean onTouchEvent(MotionEvent event) {
            if (event.getAction() == MotionEvent.ACTION_DOWN) {
                layout.setVisibility(ViewGroup.VISIBLE);
                return true;
            }
            return super.onTouchEvent(event);
        }
    }

    三、加入权限

     <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" />
    

    效果例如以下:
    这里写图片描写叙述

    版权声明:本文博主原创文章。博客,未经同意不得转载。

  • 相关阅读:
    C#中关于zip压缩解压帮助类的封装(转)
    MonoTouch的官网
    Android布局
    VS2010网站发布
    HTML5的PLACEHOLDER属性
    some np problem
    srm 578
    opencv 边缘算子
    Python扩展(pybind11混编)
    PyTorch之初级使用
  • 原文地址:https://www.cnblogs.com/gcczhongduan/p/4916282.html
Copyright © 2020-2023  润新知