android: Take camera picture without “save” / “delete” confirmation

前端 未结 6 1091
醉酒成梦
醉酒成梦 2020-12-01 11:26

I want to display an image taken from the camera in an ImageView using

Intent intent = new Intent(android.provider.MediaStore.ACTION_IMAGE_CAPTURE);
         


        
相关标签:
6条回答
  • 2020-12-01 11:33

    If your image is rotated, you can use this:

    mCamera.setDisplayOrientation(90);
    

    after

    mCamera.startPreview();
    
    0 讨论(0)
  • 2020-12-01 11:38

    You can not do it using the default intent. You will have to write a customer camera capture functionality where you can skip the preview with Ok and Cancel buttons.

    Pleas see http://developer.android.com/guide/topics/media/camera.html#custom-camera

    0 讨论(0)
  • 2020-12-01 11:39

    You can use the solution of AnujMathur_07, but if you do not want work with paths and files, in the method onPictureTaken, you can return the bitmap:

     @Override
                public void onPictureTaken(byte[] data, Camera camera) {
                    Toast.makeText(getApplicationContext(), "Picture Taken",
                            Toast.LENGTH_SHORT).show();
                    Intent intent = new Intent();
    
                Bitmap bmp = BitmapFactory.decodeByteArray(data, 0,
                        data.length);
    
                intent.putExtra("image", bmp);
                setResult(RESULT_OK, intent);
                camera.stopPreview();
                if (camera != null) {
                    camera.release();
                    mCamera = null;
                }
                finish();
            }
    

    And in the method onActivityResult you can get bitmap:

     Bundle extras = data.getExtras();
     Bitmap imageBitmap = (Bitmap) extras.get("image");
    
    0 讨论(0)
  • 2020-12-01 11:40

    Use MediaStore.EXTRA_OUTPUT param for you camera application running intent

    intent.putExtra(MediaStore.EXTRA_OUTPUT, fileUri);
    
    0 讨论(0)
  • 2020-12-01 11:41

    You ca use the SurfaceView to capture image

    package com.camera;
    
    import java.io.IOException;
    
    import android.app.Activity;
    import android.content.Intent;
    import android.hardware.Camera;
    import android.os.Bundle;
    import android.util.Log;
    import android.view.SurfaceHolder;
    import android.view.SurfaceView;
    import android.view.View;
    import android.widget.Button;
    import android.widget.Toast;
    
    public class Camera_capture extends Activity implements SurfaceHolder.Callback {
    
    private Camera mCamera;
    private SurfaceView surfaceView;
    private SurfaceHolder surfaceHolder;
    private Button capture_image;
    
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.camera_layout);
        capture_image = (Button) findViewById(R.id.capture_image);
        capture_image.setOnClickListener(new View.OnClickListener() {
    
            @Override
            public void onClick(View v) {
                capture();
            }
        });
        surfaceView = (SurfaceView) findViewById(R.id.surfaceview);
        surfaceHolder = surfaceView.getHolder();
        surfaceHolder.addCallback(Camera_capture.this);
        surfaceHolder.setType(SurfaceHolder.SURFACE_TYPE_PUSH_BUFFERS);
        try {
            mCamera = Camera.open();
            mCamera.setPreviewDisplay(surfaceHolder);
            mCamera.startPreview();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
    
    private void capture() {
        mCamera.takePicture(null, null, null, new Camera.PictureCallback() {
    
            @Override
            public void onPictureTaken(byte[] data, Camera camera) {
                Toast.makeText(getApplicationContext(), "Picture Taken",
                        Toast.LENGTH_SHORT).show();
                Intent intent = new Intent();
                intent.putExtra("image_arr", data);
                setResult(RESULT_OK, intent);
                camera.stopPreview();
                if (camera != null) {
                    camera.release();
                    mCamera = null;
                }
                finish();
            }
        });
    }
    
    @Override
    public void surfaceChanged(SurfaceHolder holder, int format, int width,
            int height) {
        Log.e("Surface Changed", "format   ==   " + format + ",   width  ===  "
                + width + ", height   ===    " + height);
        try {
            mCamera.setPreviewDisplay(holder);
            mCamera.startPreview();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
    
    @Override
    public void surfaceCreated(SurfaceHolder holder) {
        Log.e("Surface Created", "");
    }
    
    @Override
    public void surfaceDestroyed(SurfaceHolder holder) {
        Log.e("Surface Destroyed", "");
    }
    
    @Override
    protected void onPause() {
        super.onPause();
        if (mCamera != null) {
            mCamera.stopPreview();
            mCamera.release();
        }
    }
    }
    

    And the layout file would be

    <?xml version="1.0" encoding="utf-8"?>
    <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent"
    android:orientation="vertical" >
    
    <SurfaceView
        android:id="@+id/surfaceview"
        android:layout_width="fill_parent"
        android:layout_weight="100"
        android:layout_height="wrap_content" />
    
    <Button
        android:id="@+id/capture_image"
        android:layout_width="fill_parent"
        android:layout_height="wrap_content"
        android:layout_weight="1"
        android:text="Capture" />
    
    </LinearLayout>
    

    Start this Camera_capture activity with startActivityForResult and onActivityResult you can get the image as byte array as

    byte[] image = data.getExtras().getByteArray("image_arr");
    

    where data is the received data.

    Decode the byte array to Bitmap using

    Bitmap bmp = BitmapFactory.decodeByteArray(image, 0,
                        image.length);
    

    now set this Bitmap


    Edit

    As there is some problem while returning byte[], the byte[] should be save in a file and the path of the file should be sent to the previous Activity so that file can be read.

    In onPictureTaken(), just add

    String PATH = "Any path to store a file";
    try {
        FileOutputStream fos=new FileOutputStream(PATH);
    
        fos.write(data);
        fos.close();
      }
      catch (java.io.IOException e) {
    
      }
    

    and in place of :

    intent.putExtra("image_arr", data);
    

    write

    intent.putExtra("image_path", PATH);
    

    and receive this path in previous Activity's onActivityResult as :

    String imagePath = data.getExtras().getString("image_path");
    
    0 讨论(0)
  • 2020-12-01 11:42

    Use "android.intent.extra.quickCapture"

    Intent intent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);
    intent.putExtra("android.intent.extra.quickCapture",true);
    if (intent.resolveActivity(getPackageManager()) != null) {
        startActivityForResult(intent, REQUEST_IMAGE_CAPTURE);
    }
    
    0 讨论(0)
提交回复
热议问题