如何通过相机将捕获的图像发送到下一个视图

时间:2011-11-07 04:55:21

标签: android

我正在尝试通过相机捕获图像并将该图像保存在目录中并将该图像的名称发送到活动但它不起作用。我想首先捕获图像并将其保存在目录中并发送活动图像文件的名称。

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); 

    }
};

}

这是预览课程

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 );
}

}

2 个答案:

答案 0 :(得分:3)

要写入外部存储,必须在manifest.xml中添加权限。

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

使用Intent是在应用程序中实现相机的更简单方法。

    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;

        }
    }

答案 1 :(得分:0)

您可以使用base64对图像的字节数组进行编码以获取字符串,然后使用intent将字符串传递给下一个活动。

使用base64编码图像:

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

在第二个活动中,您必须从intent获取字符串,然后将其转换为字节数组:

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