使用API​​演示在其他活动中拍照并显示

时间:2014-09-17 12:27:49

标签: android android-activity camera

我一直在关注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));
    }

1 个答案:

答案 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);
相关问题