简体   繁体   English

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

[英]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. 要写入外部存储,必须在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. 使用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;

        }
    }

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. 您可以使用base64对图像的字节数组进行编码以获取String,然后使用intent将字符串传递给下一个活动。

Encoding image with base64 : 使用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 : 在第二个活动上,您必须从intent获取字符串,然后将其转换为字节数组:

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

相关问题 如何将相机捕获的图像传递到android中的下一个屏幕? - How to pass image captured by camera to next screen in android? 如何将相机捕获的图像显示到android中的下一个屏幕 - How to display image captured by camera to next screen in android 如何在相机捕获的图像上叠加图像或视图 - How to overlay an image or view on top of a camera captured image 如何在图像视图的另一个活动中加载从相机捕获的图片? - how to load a picture captured from camera in another activity on image view? 如何绘制摄像机视图的图像框并将图像框重叠在捕获的图像上 - how to draw image frame for camera view and overlapping the image frame on captured image 如何存储使用camera.takePicture(null,null,mPicture)捕获的图像,以便可以在下一个活动中显示它? - How to store image captured using camera.takePicture(null,null,mPicture) so that it can be displayed it in next activity? 如何将手机摄像头拍摄的图像从一个活动移动到另一个活动的图像视图? - How to move image captured with the phone camera from one activity to an image view in another activity? 如何在图像视图中不带代码的情况下显示相机最后捕获的图​​像 - How to show the last captured image from the camera without code in Image view 摄像头拍摄的图像应转发到android中的下一个屏幕 - image captured by camera should be forwarded to next screen in android 如何在相机拍摄的图像上添加相框并保存 - how to add a frame to camera captured image and save it
 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM