Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

surfaceview for camera is not working in android lollipop os

Today I had faced an issue in android surfaceview for camera customization. I tried the below code.

The Issue occurred when I captured the image, it stops the camera preview and doesn't return to the activity.

Following code will be implemented in the program. I took this code from an existing reference on stackoverflow

  1. Supporting Class.

    public class AndroidCameraSurfaceview extends Activity implements
        SurfaceHolder.Callback {
    TextView testView;
    
    Camera camera;
    SurfaceView surfaceView;
    SurfaceHolder surfaceHolder;
    boolean preview;
    
    PictureCallback rawCallback;
    ShutterCallback shutterCallback;
    PictureCallback jpegCallback;
    int displayheight, displaywidth;
    Camera.PreviewCallback previewCallback;
    
    /** Called when the activity is first created. */
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        requestWindowFeature(Window.FEATURE_NO_TITLE);
        setContentView(R.layout.camerasurfaceview);
    
        getWindow().addFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN);
        getWindow().addFlags(WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON);
        surfaceView = (SurfaceView) findViewById(R.id.surfaceView);
        surfaceHolder = surfaceView.getHolder();
    
        surfaceHolder.addCallback(this);
    
        surfaceHolder.setType(SurfaceHolder.SURFACE_TYPE_PUSH_BUFFERS);
    
        jpegCallback = new PictureCallback() {
            public void onPictureTaken(byte[] data, Camera camera) {
                Bundle b = new Bundle();
                b.putByteArray("Image", data);
                Intent intent = new Intent();
                intent.putExtras(b);
                setResult(RESULT_OK, intent);
                finish();
                // refreshCamera();
            }
        };
    }
    
    
    
    public void captureImage(View v) throws IOException {
                // take the picture
                camera.takePicture(null, null, jpegCallback);
            }
    
        public void refreshCamera() {
            if (surfaceHolder.getSurface() == null) {
                // preview surface does not exist
                return;
            }
    
            try {
                camera.stopPreview();
            } catch (Exception e) {
            }
    
            try {
                camera.setDisplayOrientation(90);
                camera.setPreviewDisplay(surfaceHolder);
                camera.startPreview();
            } catch (Exception e) {
    
            }
        }
    
        public void surfaceChanged(SurfaceHolder holder, int format, int width,
                int height) {
            if (preview) {
                camera.stopPreview();
            }
    try{
            Camera.Parameters parameters = camera.getParameters();
            List<Size> sizes = parameters.getSupportedPreviewSizes();
            Size optimalSize = getOptimalPreviewSize(sizes, width, height);
            parameters.setPreviewSize(optimalSize.width, optimalSize.height);
            camera.setParameters(parameters);
            try {
                camera.setDisplayOrientation(90);
                camera.setPreviewDisplay(holder);
                camera.startPreview();
                preview = true;
            } catch (IOException e) {
                e.printStackTrace();
            }
    }catch(Exception e){
        System.out.println("Surface Exception---=>"+e);
    }
        }
    
        public void surfaceCreated(SurfaceHolder holder) {
            camera = Camera.open();
            if (camera != null) {
                Camera.Parameters params = camera.getParameters();
                camera.setDisplayOrientation(90);
                camera.setParameters(params);
    
            }
        }
    
        public void surfaceDestroyed(SurfaceHolder holder) {
            // stop preview and release camera
            camera.stopPreview();
            camera.release();
            camera = null;
        }
    
        private Size getOptimalPreviewSize(List<Size> sizes, int w, int h) {
            final double ASPECT_TOLERANCE = 1;
            double targetRatio = (double) w / h;
            if (sizes == null)
                return null;
            Size optimalSize = null;
            double minDiff = Double.MAX_VALUE;
            int targetHeight = h;
            for (Size size : sizes) {
                double ratio = (double) size.width / size.height;
                if (Math.abs(ratio - targetRatio) > ASPECT_TOLERANCE)
                    continue;
                if (Math.abs(size.height - targetHeight) < minDiff) {
                    optimalSize = size;
                    minDiff = Math.abs(size.height - targetHeight);
                }
            }
    
            if (optimalSize == null) {
                minDiff = Double.MAX_VALUE;
                for (Size size : sizes) {
                    if (Math.abs(size.height - targetHeight) < minDiff) {
                        optimalSize = size;
                        minDiff = Math.abs(size.height - targetHeight);
                    }
                }
            }
            return optimalSize;
        }
    
        }
    

    2.Implemented in Activity

    public void captureImage() {

        Intent intentDriver = new Intent(AddNewDevice_Activity.this,
                AndroidCameraSurfaceview.class);
        startActivityForResult(intentDriver, 0);
        //
        // Intent intent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);
        //
        // Uri fileUri = getOutputMediaFileUri(MEDIA_TYPE_IMAGE);
        //
        // intent.putExtra(MediaStore.EXTRA_OUTPUT, fileUri);
        //
        // // start the image capture Intent
        // startActivityForResult(intent, CAMERA_CAPTURE_IMAGE_REQUEST_CODE);
    
        // Intent intent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);
        //
        // fileUri = getOutputMediaFileUri(MEDIA_TYPE_IMAGE);
        //
        // intent.putExtra(MediaStore.EXTRA_OUTPUT, fileUri);
        //
        // // start the image capture Intent
        // startActivityForResult(intent, CAMERA_CAPTURE_IMAGE_REQUEST_CODE);
    
    }
    
    protected void onActivityResult(int requestCode, int resultCode, Intent data) {
    
        super.onActivityResult(requestCode, resultCode, data);
    
        if (requestCode == 0) {
    
            System.out.println("Result Code: " + resultCode);
            if (resultCode == RESULT_OK && data != null) {
    
                Bundle bundle = data.getExtras();
                byte[] test = bundle.getByteArray("Image");
                Bitmap bpCamera = BitmapFactory.decodeByteArray(test, 0,
                        test.length);
                Matrix matrix = new Matrix();
                matrix.postRotate(90);
                bpCamera = Bitmap
                        .createBitmap(bpCamera, 0, 0, bpCamera.getWidth(),
                                bpCamera.getHeight(), matrix, true);
    
                imageView_camera.setImageBitmap(bpCamera);
                selectedImageStr = encodeTobase64(bpCamera);
            }
    
        } else {
            finish();
        }
    
    }
    
like image 990
MohanRaj S Avatar asked Jul 17 '15 08:07

MohanRaj S


People also ask

What is SurfaceView Android?

Provides a dedicated drawing surface embedded inside of a view hierarchy. You can control the format of this surface and, if you like, its size; the SurfaceView takes care of placing the surface at the correct location on the screen.

How to rotate camera preview in Android?

The expression deviceOrientationDegrees * sign + 360 converts device rotation from counterclockwise to clockwise for back-facing cameras (for example, converting 270 degrees counterclockwise to 90 degrees clockwise).

What is camera preview in Android?

PreviewView — Implementation modes To display the camera feed, it uses either a SurfaceView or TextureView , provides a preview surface to the camera when it's ready, tries to keep it valid as long as the camera is using it, and when released prematurely, provides a new surface if the camera is still in use.


1 Answers

You shold split activity and surface view.

public class AndroidCameraActivity extends Activity {
    AndroidCameraSurfaceview surfaceView;
    ...
    @Override
    public void onCreate(Bundle savedInstanceState) {
        ...
        surfaceView = (AndroidCameraSurfaceview) findViewById(R.id.surfaceView);
    }
}

class AndroidCameraSurfaceview extends SurfaceView implements SurfaceHolder.Callback {
    public AndroidCameraSurfaceview(Context context, AttributeSet attrs) {
        super(context, attrs);
        getHolder().addCallback(this);
        ...
    }

    public void surfaceCreated(SurfaceHolder holder) {
        ...
    }

    public void surfaceDestroyed(SurfaceHolder holder) {
        ...
    }

    public void surfaceChanged(SurfaceHolder holder, int format, int width,
            int height) {
        ...
    }
}
like image 167
Toris Avatar answered Oct 15 '22 22:10

Toris