Camera Tutorial for Android (using surfaceview)

后端 未结 5 1353
情歌与酒
情歌与酒 2020-11-27 13:09

Here is my example code:

package newslab.video.server;

import android.app.Activity;
import android.hardware.Camera;
import android.os.Bundle;
import android         


        
相关标签:
5条回答
  • 2020-11-27 13:33

    Camera permission in manifiest file:

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

    Permission for storing image from sdcard in manifiest file:

    <uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
    <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
    
    0 讨论(0)
  • 2020-11-27 13:38

    I was having issues with camera, figuring out how to implement and work with and came across this resources: Camera preview. At the bottom of the page you have examples of the most common scenarios as well as the one in your original question: Take and preview Photo

    0 讨论(0)
  • 2020-11-27 13:42

    If you are using android 10 or later don't forget to add this in your manifest file

    android:requestLegacyExternalStorage="true"
    android:grantUriPermissions="true"
    
    0 讨论(0)
  • 2020-11-27 13:51

    Ok. So here is the solution:

    I am not adding any try catch. This is simply for the capturing the image and storing it into the sdcard.

    public class VideoServer extends Activity implements SurfaceHolder.Callback {
        TextView testView;
    
        Camera camera;
        SurfaceView surfaceView;
        SurfaceHolder surfaceHolder;
        PictureCallback rawCallback;
        ShutterCallback shutterCallback;
        PictureCallback jpegCallback;
        private final String tag = "VideoServer";
    
        Button start, stop, capture;
    
        /** Called when the activity is first created. */
        @Override
        public void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.main);
    
            start = (Button)findViewById(R.id.btn_start);
            start.setOnClickListener(new Button.OnClickListener()
            {
                public void onClick(View arg0) {
                    start_camera();
                }
            });
            stop = (Button)findViewById(R.id.btn_stop);
            capture = (Button) findViewById(R.id.capture);
            stop.setOnClickListener(new Button.OnClickListener()
            {
                public void onClick(View arg0) {
                    stop_camera();
                }
            });
            capture.setOnClickListener(new OnClickListener() {
    
                @Override
                public void onClick(View v) {
                    // TODO Auto-generated method stub
                    captureImage();
                }
            });
    
            surfaceView = (SurfaceView)findViewById(R.id.surfaceView1);
            surfaceHolder = surfaceView.getHolder();
            surfaceHolder.addCallback(this);
            surfaceHolder.setType(SurfaceHolder.SURFACE_TYPE_PUSH_BUFFERS);
            rawCallback = new PictureCallback() {
                public void onPictureTaken(byte[] data, Camera camera) {
                    Log.d("Log", "onPictureTaken - raw");
                }
            };
    
            /** Handles data for jpeg picture */
            shutterCallback = new ShutterCallback() {
                public void onShutter() {
                    Log.i("Log", "onShutter'd");
                }
            };
            jpegCallback = new PictureCallback() {
                public void onPictureTaken(byte[] data, Camera camera) {
                    FileOutputStream outStream = null;
                    try {
                        outStream = new FileOutputStream(String.format(
                                "/sdcard/%d.jpg", System.currentTimeMillis()));
                        outStream.write(data);
                        outStream.close();
                        Log.d("Log", "onPictureTaken - wrote bytes: " + data.length);
                    } catch (FileNotFoundException e) {
                        e.printStackTrace();
                    } catch (IOException e) {
                        e.printStackTrace();
                    } finally {
                    }
                    Log.d("Log", "onPictureTaken - jpeg");
                }
            };
        }
    
        private void captureImage() {
            // TODO Auto-generated method stub
            camera.takePicture(shutterCallback, rawCallback, jpegCallback);
        }
    
        private void start_camera()
        {
            try{
                camera = Camera.open();
            }catch(RuntimeException e){
                Log.e(tag, "init_camera: " + e);
                return;
            }
            Camera.Parameters param;
            param = camera.getParameters();
            //modify parameter
            param.setPreviewFrameRate(20);
            param.setPreviewSize(176, 144);
            camera.setParameters(param);
            try {
                camera.setPreviewDisplay(surfaceHolder);
                camera.startPreview();
                //camera.takePicture(shutter, raw, jpeg)
            } catch (Exception e) {
                Log.e(tag, "init_camera: " + e);
                return;
            }
        }
    
        private void stop_camera()
        {
            camera.stopPreview();
            camera.release();
        }
    
        public void surfaceChanged(SurfaceHolder arg0, int arg1, int arg2, int arg3) {
            // TODO Auto-generated method stub
        }
    
        public void surfaceCreated(SurfaceHolder holder) {
            // TODO Auto-generated method stub
        }
    
        public void surfaceDestroyed(SurfaceHolder holder) {
            // TODO Auto-generated method stub
        }
    
    }
    

    Don't press caputure button before the start,because I didn't checked it. I just wanted to show you that how to capture and store image into the sdcard.

    0 讨论(0)
  • 2020-11-27 13:52

    Dont forget to take the permission for using camera in Android Manifest file,

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

    Also you have to take permission for storing images on SD Card,

    <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"></uses-permission>
    
    0 讨论(0)
提交回复
热议问题