简体   繁体   中英

how to send captured image by camera to a next view

I am trying to capture the image via camera and save that image in the directory and send that name of the image to an activity but it does not work.I want to capture an image first and save it in the directory and send that name of the image file to a activity.

package com.example;

import java.io.ByteArrayOutputStream;
import java.io.File;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import android.app.Activity;
import android.app.AlertDialog;
import android.content.Intent;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.hardware.Camera;
import android.hardware.Camera.PictureCallback;
import android.hardware.Camera.ShutterCallback;
import android.os.Bundle;
import android.os.Environment;
import android.util.Log;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.FrameLayout;
import android.widget.Toast;

public class CameraDemo extends Activity {
private static final String TAG = "CameraDemo";
Camera camera;
Preview preview;
Button buttonClick;
String imgName="img";
Intent intentImg;
/** Called when the activity is first created. */
@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.main);

    preview = new Preview(this);
    ((FrameLayout) findViewById(R.id.preview)).addView(preview);
    buttonClick = (Button) findViewById(R.id.buttonClick);
    buttonClick.setOnClickListener( new OnClickListener() {
        public void onClick(View v) {


        }
    });

    Log.d(TAG, "onCreate'd");
}


ShutterCallback shutterCallback = new ShutterCallback() {
    public void onShutter() {
        Log.d(TAG, "onShutter'd");
    }
};

/** Handles data for raw picture */
PictureCallback rawCallback = new PictureCallback() {
    public void onPictureTaken(byte[] data, Camera camera) {
        Log.d(TAG, "onPictureTaken - raw");
    }
};

/** Handles data for jpeg picture */
PictureCallback jpegCallback = new PictureCallback() {
    public void onPictureTaken(byte[] data, Camera camera) {
        Bitmap bitmapPicture = BitmapFactory.decodeByteArray(data,0,data.length);
        File imageDirectory = new File(Environment.getExternalStorageDirectory() + File.separator + "surbeyImg");
        imageDirectory.mkdirs();
        File f = new File(Environment.getExternalStorageDirectory()
         + File.separator + "surbeyImg" + File.separator + imgName+".jpg");
         try 
         {
                f.createNewFile();
                //write the bytes in file
                FileOutputStream fo = new FileOutputStream(f);
                fo.write(data);
          } catch (IOException e) 
          {
            e.printStackTrace();
          }
         intentImg = new Intent(CameraDemo.this, ShowImg.class);
         intentImg.putExtra("img",imgName);
         startActivity(intentImg); 

    }
};

}

this is preview class

package com.example;

import java.io.File;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;

import android.content.Context;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.graphics.Canvas;
import android.graphics.Color;
import android.graphics.Paint;
import android.hardware.Camera;
import android.hardware.Camera.PreviewCallback;
import android.os.Environment;
import android.util.Log;
import android.view.SurfaceHolder;
import android.view.SurfaceView;


class Preview extends SurfaceView implements SurfaceHolder.Callback {
private static final String TAG = "Preview";

SurfaceHolder mHolder;
public Camera camera;

Preview(Context context) {
    super(context);

    // Install a SurfaceHolder.Callback so we get notified when the
    // underlying surface is created and destroyed.
    mHolder = getHolder();
    mHolder.addCallback(this);
    mHolder.setType(SurfaceHolder.SURFACE_TYPE_PUSH_BUFFERS);
}

public void surfaceCreated(SurfaceHolder holder) {
    // The Surface has been created, acquire the camera and tell it where
    // to draw.
    camera = Camera.open();
    try {
        camera.setPreviewDisplay(holder);


        camera.setPreviewCallback(new PreviewCallback() {

            public void onPreviewFrame(byte[] data, Camera arg1) {
                Bitmap bitmapPicture = BitmapFactory.decodeByteArray(data,0,data.length);
                File imageDirectory = new File(Environment.getExternalStorageDirectory() + File.separator + "surbeyImg");
                imageDirectory.mkdirs();
                File f = new File(Environment.getExternalStorageDirectory()
                 + File.separator + "surbeyImg" + File.separator + "a.jpg");
                 try 
                 {
                        f.createNewFile();
                        //write the bytes in file
                        FileOutputStream fo = new FileOutputStream(f);
                        fo.write(data);
                  } catch (IOException e) 
                  {
                    e.printStackTrace();

                  } finally 
                  {
                  }
                    Preview.this.invalidate();
            }
        });
    } catch (IOException e) {
        e.printStackTrace();
    }
}

public void surfaceDestroyed(SurfaceHolder holder) {
    // Surface will be destroyed when we return, so stop the preview.
    // Because the CameraDevice object is not a shared resource, it's very
    // important to release it when the activity is paused.
    camera.stopPreview();
    camera = null;
}

public void surfaceChanged(SurfaceHolder holder, int format, int w, int h) {
    // Now that the size is known, set up the camera parameters and begin
    // the preview.
    Camera.Parameters parameters = camera.getParameters();
    parameters.setPreviewSize(w, h);
    camera.setParameters(parameters);
    camera.startPreview();
}

@Override
public void draw(Canvas canvas) {
        super.draw(canvas);
        Paint p= new Paint(Color.RED);
        Log.d(TAG,"draw");
        canvas.drawText("PREVIEW", canvas.getWidth()/2, canvas.getHeight()/2, p );
}

}

To write to external storage, permission must be addded in manifest.xml.

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

Use of Intent is an easier way of implementing camera in your application.

    private static final int REQ_CAPTURE_CAPTURE__IMAGE = 0;
    private String imagePath;

/**
     * Start camera activity.
     */
    protected void startCameraActivity() {
        String imageDirectory = Environment.getExternalStorageDirectory()
        + File.separator + "surbeyImg";
        File imageDirectory = new File(imageDirectory);

        if (!(imageDirectory.exists())) {
            imageDirectory.mkdir();
        }

        String imagePath = imageDirectory + File.separator + imgName+".jpg");   

        File file = new File(imagePath);   
        Uri outputFileUri = Uri.fromFile(file);

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

        intent.putExtra(MediaStore.EXTRA_OUTPUT, outputFileUri);
        intent.putExtra("outputFormat", Bitmap.CompressFormat.PNG.toString());
        startActivityForResult(intent, REQ_CAPTURE_CAPTURE__IMAGE);
    }

    protected void onActivityResult(int requestCode, int resultCode,
            Intent imageReturnedIntent) {

        switch (requestCode) {

        case REQ_CAPTURE_CAPTURE__IMAGE:

            if (resultCode == RESULT_OK) {
                Intent intentImg = new Intent(CameraDemo.this, ShowImg.class);             
                intentImg.putExtra("imagePath",imagePath);         
                startActivity(intentImg); 

            }

            break;

        default:
            break;

        }
    }

You can encode the byte array of the image with base64 to get a String, then pass the string to the next activity using intent.

Encoding image with base64 :

String encodedImage = Base64.encodeToString(imageDatas, Base64.DEFAULT);

On the second activity, you have to get the string from intent then convert it to byte array :

byte[] imageDatas = Base64.decode(encodedImage, Base64.DEFAULT);

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM