我一直在关注Android开发者网站上的Camera API Demo。在修好了很多stuf后,我遇到了我的最后一个问题。我想用我刚刚拍摄的照片并将其显示在另一个活动中(比如你拍照后首先要接受它或重做它的风格)。
我的TakePhoto课程:
public class TakePhoto extends Activity {
public static final int MEDIA_TYPE_IMAGE = 1;
private static final int CAPTURE_IMAGE_ACTIVITY_REQUEST_CODE = 100;
ImageButton captureButton;
private Camera mCamera;
private CameraPreview mPreview;
private Handler handler = new Handler();
private int SELECT_PICTURE = 1;
private String selectedImagePath;
FrameLayout preview;
private String documentType;
private Camera.Parameters p;
private PictureCallback mPicture = new PictureCallback() {
private String TAG = "DocsPro";
@Override
public void onPictureTaken(byte[] data, Camera camera) {
File pictureFile = getOutputMediaFile(MEDIA_TYPE_IMAGE);
if (pictureFile == null) {
Log.d(TAG, "Error creating media file, check storage permissions : PICTURE FILE IS NULL");
return;
}
try {
FileOutputStream fos = new FileOutputStream(pictureFile);
Log.d(TAG, "fos.new");
fos.write(data);
Log.d(TAG, "fos.write");
fos.close();
Log.d(TAG, "fos.close");
} catch (FileNotFoundException e) {
Log.d(TAG, "File not found: " + e.getMessage());
} catch (IOException e) {
Log.d(TAG, "Error accessing file: " + e.getMessage());
}
}
};
//Accessing cameras
@Override
protected void onCreate(Bundle savedInstanceState) {
// TODO Auto-generated method stub
super.onCreate(savedInstanceState);
setContentView(R.layout.scan);
Intent myIntent = getIntent();
documentType = myIntent.getStringExtra("documentType");
Button terug = (Button) findViewById(R.id.button_terug);
ImageButton iTerug = (ImageButton) findViewById(R.id.imageButton_terug);
ImageButton gallery = (ImageButton) findViewById(R.id.button_galery);
ImageButton flash = (ImageButton) findViewById(R.id.button_flash);
preview = (FrameLayout) findViewById(R.id.camera_preview);
// Create an instance of Camera
mCamera = getCameraInstance();
// Create our Preview view and set it as the content of our activity.
mPreview = new CameraPreview(TakePhoto.this, mCamera);
captureButton = (ImageButton) findViewById(R.id.button_capture);
preview.addView(mPreview);
captureButton.bringToFront();
gallery.bringToFront();
flash.bringToFront();
p = mCamera.getParameters();
gallery.setOnClickListener(
new OnClickListener(){
@Override
public void onClick(View v)
{
// in onCreate or any event where your want the user to
// select a file
Intent intent = new Intent();
intent.setType("image/*");
intent.setAction(Intent.ACTION_GET_CONTENT);
startActivityForResult(Intent.createChooser(intent,
"Select Picture"), SELECT_PICTURE);
}
}
);
flash.setOnClickListener( new OnClickListener() {
@Override
public void onClick(View v) {
// TODO Auto-generated method stub
if(p.getFlashMode() == android.hardware.Camera.Parameters.FLASH_MODE_ON){
p.setFlashMode(Camera.Parameters.FLASH_MODE_TORCH);
mCamera.setParameters(p);
mCamera.startPreview();
Log.e("Torch","MODE ON");
}else if(p.getFlashMode() == android.hardware.Camera.Parameters.FLASH_MODE_OFF){
p.setFlashMode(Camera.Parameters.FLASH_MODE_TORCH);
mCamera.setParameters(p);
mCamera.release();
mCamera=null;
Log.e("Torch","MODE OFF");
}else if(p.getFlashMode() == android.hardware.Camera.Parameters.FLASH_MODE_AUTO){
p.setFlashMode(Camera.Parameters.FLASH_MODE_TORCH);
mCamera.setParameters(p);
mCamera.startPreview();
Log.e("Torch","MODE AUTO");
}else if(p.getFlashMode() == android.hardware.Camera.Parameters.FLASH_MODE_TORCH){
p.setFlashMode(Camera.Parameters.FLASH_MODE_AUTO);
mCamera.setParameters(p);
mCamera.startPreview();
Log.e("Torch","MODE TORCH");
}else{
p.setFlashMode(Camera.Parameters.FLASH_MODE_TORCH);
mCamera.setParameters(p);
mCamera.startPreview();
Log.e("Torch","MODE ELSE");
}
}
});
// Add a listener to the Capture button
captureButton.setOnClickListener(
new View.OnClickListener() {
@Override
public void onClick(View v) {
// get an image from the camera
handler.postDelayed(new Runnable() {
@Override
public void run() {
mCamera.autoFocus(autoFocusCallback);
}
}, 1500L);
}
AutoFocusCallback autoFocusCallback=new AutoFocusCallback() {
@Override
public void onAutoFocus(boolean success, Camera camera) {
mCamera.takePicture(null, null, mPicture);
}
};
});
// Add listeners to Terug buttons
terug.setOnClickListener(new OnClickListener() {
public void onClick(View v) {
Intent intent = new Intent(TakePhoto.this, PickDocumentType.class);
startActivity(intent);
finish();
}
});
// Add listeners to Terug buttons
iTerug.setOnClickListener(new OnClickListener() {
public void onClick(View v) {
Intent intent = new Intent(TakePhoto.this, PickDocumentType.class);
startActivity(intent);
finish();
}
});
}
/**
* A safe way to get an instance of the Camera object.
*/
public static Camera getCameraInstance() {
Camera c = null;
try {
c = Camera.open(); // attempt to get a Camera instance
} catch (Exception e) {
// Camera is not available (in use or does not exist)
}
return c; // returns null if camera is unavailable
}
/**
* Create a File for saving an image or video
*/
@SuppressLint("SimpleDateFormat")
private static File getOutputMediaFile(int type) {
// To be safe, you should check that the SDCard is mounted
// using Environment.getExternalStorageState() before doing this.
File mediaStorageDir = new File(Environment.getExternalStoragePublicDirectory(
Environment.DIRECTORY_PICTURES), "DocsPro");
// This location works best if you want the created images to be shared
// between applications and persist after your app has been uninstalled.
// Create the storage directory if it does not exist
if (!mediaStorageDir.exists()) {
if (!mediaStorageDir.mkdirs()) {
Log.d("MyCameraApp", "failed to create directory");
return null;
}
}
// Create a media file name
String timeStamp = new SimpleDateFormat("yyyyMMdd_HHmmss").format(new Date());
File mediaFile;
if (type == MEDIA_TYPE_IMAGE) {
mediaFile = new File(mediaStorageDir.getPath() + File.separator +
"IMG_" + timeStamp + ".jpg");
} else {
return null;
}
return mediaFile;
}
/**
* helper to retrieve the path of an image URI
*/
public String getPath(Uri uri) {
String[] projection = { MediaStore.Images.Media.DATA };
Cursor cursor = managedQuery(uri, projection, null, null, null);
if(cursor!=null)
{
//HERE YOU WILL GET A NULLPOINTER IF CURSOR IS NULL
//THIS CAN BE, IF YOU USED OI FILE MANAGER FOR PICKING THE MEDIA
int column_index = cursor
.getColumnIndexOrThrow(MediaStore.Images.Media.DATA);
cursor.moveToFirst();
return cursor.getString(column_index);
}
else return null;
}
@Override
protected void onPause() {
super.onPause();
releaseCamera(); // release the camera immediately on pause event
}
private void releaseCamera() {
if (mCamera != null) {
mCamera.stopPreview();
mCamera.setPreviewCallback(null);
mCamera.release(); // release the camera for other applications
mCamera = null;
}
}
@Override
public void onStop()
{
super.onStop();
releaseCamera();
}
//Receiving camera intent result.
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
if (requestCode == CAPTURE_IMAGE_ACTIVITY_REQUEST_CODE) {
if (resultCode == RESULT_OK) {
// Image captured and saved to fileUri specified in the Intent
Log.d("foto", "Image saved to:\n" +
data.getData());
} else if (resultCode == RESULT_CANCELED) {
// User cancelled the image capture
} else {
// Image capture failed, advise user
}
}
else if (requestCode == SELECT_PICTURE)
{
if (resultCode == RESULT_OK) {
releaseCamera();
Uri selectedImageUri = data.getData();
//MEDIA GALLERY
selectedImagePath = getPath(selectedImageUri);
Intent edit = new Intent(TakePhoto.this, EditPhoto.class);
edit.putExtra("filepath", selectedImagePath);
edit.putExtra("documentType", documentType);
startActivity(edit);
finish();
releaseCamera();
}
}
}
}
如何获取上述课程中的图像并将其转移到我的新活动中?
编辑我自己的解决方案:
我记得我有一个方法可以为我的图像创建目录,所以我知道了位置。唯一的技巧是获取文件路径。并且因为方法getOutputMediaFile保存在文件中我只需要getAbsolutePath()并使用intent发送它:
String filepath = pictureFile.getAbsolutePath();
Intent edit = new Intent(TakePhoto.this, EditPhoto.class);
edit.putExtra("filepath", filepath);
startActivity(edit);
finish();
然后在其他活动中,我就这样得到它并显示出来:
@Override
public void onCreate(Bundle savedInstanceState)
{
super.onCreate(savedInstanceState);
setContentView(R.layout.bijsnijden);
Intent myIntent = getIntent();
imagePath = myIntent.getStringExtra("filepath");
documentType = myIntent.getStringExtra("documentType");
ImageView imageView = (ImageView) findViewById(R.id.Image);
imageView.setImageBitmap(BitmapFactory.decodeFile(imagePath));
}
答案 0 :(得分:0)
在将其添加到intent之前将其转换为Byte数组,将其发送出去并解码。
//Convert to byte array
ByteArrayOutputStream stream = new ByteArrayOutputStream();
bmp.compress(Bitmap.CompressFormat.PNG, 100, stream);
byte[] byteArray = stream.toByteArray();
Intent in1 = new Intent(this, Activity2.class);
in1.putExtra("image",byteArray);
然后在活动2中:
byte[] byteArray = getIntent().getByteArrayExtra("image");
Bitmap bmp = BitmapFactory.decodeByteArray(byteArray, 0, byteArray.length);