[英]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);
}
};
}
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.