在Android中,相机图像返回缩略图

3
在我的Android应用中,我想从相机中捕获一张图像并将该图像的Uri传递到下一个活动。这里,我得到了一张缩略图。为了解决这个问题,我在我的图片捕获意图中使用了MediaStore.EXTRA_OUTPUT。现在,我不知道如何获取当前捕获的图像的URI。我尝试了下面的代码并在下一个活动中传递了imageUri,但它抛出了NoSuchFileDirectory异常。我参考了这个链接,但是没有得到任何关于获取捕获的图像Uri并将其传递到下一个活动的清晰想法。请帮我解决这个问题。如果您发现这个代码有任何问题,那么请建议我哪里出了错。
代码:
        btnCamera.setOnClickListener(new OnClickListener() {

            @Override
            public void onClick(View v) {
                dialog.dismiss();
                Intent pictureActionIntent = new Intent(
                        android.provider.MediaStore.ACTION_IMAGE_CAPTURE);

                File photo = null;
                try {

                    photo = SaveCameraImage();

                } catch (Exception e) {
                    Log.e("Camera capture-------------",
                            "Can't create file to take picture!");
                    Toast.makeText(SelectFrameActivity.this,
                            "Please check SD card! Image shot is impossible!",
                            10000).show();

                }
                mImageUri = Uri.fromFile(photo);
                pictureActionIntent
                        .putExtra(MediaStore.EXTRA_OUTPUT, mImageUri);

                startActivityForResult(pictureActionIntent, TAKE_PICTURE);
            }
        });


private File SaveCameraImage() {
        try {
            SimpleDateFormat sdf = new SimpleDateFormat("yyyyMMdd_HHmmss");
            String dt = sdf.format(new Date());

            imageFile = null;
            imageFile = new File(Environment.getExternalStorageDirectory(),
                    "FrameFace/" + "Camera_" + dt + ".png");
            Log.e("New Camera Image Path:-",
                    Environment.getExternalStorageDirectory() + "/FrameFace/"
                            + "Camera_" + dt + ".png");

            if (!imageFile.exists())
                imageFile.createNewFile();

            bmp_camera_image.compress(Bitmap.CompressFormat.PNG, 100,
                    new FileOutputStream(imageFile));

            Log.e("imagetext", "the file has saved to the sdcard");

            imagePath = Environment.getExternalStorageDirectory()
                    + "/FrameFace/" + "Camera_" + dt + ".png";

            Log.e("FaceFrameActivity - SaveCameraImage: ", "Image is Saved to"
                    + imagePath);

        } catch (Exception ex) {
            ex.printStackTrace();
        }
        return imageFile;
    }

@Override
    protected void onActivityResult(int requestCode, int resultCode,
            final Intent data) {
        super.onActivityResult(requestCode, resultCode, data);
        switch (requestCode) {
        case TAKE_PICTURE:
            Log.e("result code: ", Integer.toString(Activity.RESULT_OK) + " "
                    + Integer.toString(resultCode));

            if (resultCode == Activity.RESULT_OK) {

                // bmp_camera_image = (Bitmap) data.getExtras().get("data");
                SaveCameraImage();

                // this.getContentResolver().notifyChange(mImageUri, null);
                // ContentResolver cr = this.getContentResolver();
                // try {
                // GlobalClass.cameraBitmap =
                // android.provider.MediaStore.Images.Media
                // .getBitmap(cr, mImageUri);
                // } catch (FileNotFoundException e) {
                // // TODO Auto-generated catch block
                // e.printStackTrace();
                // } catch (IOException e) {
                // // TODO Auto-generated catch block
                // e.printStackTrace();
                // }

                Handler h = new Handler();
                h.postDelayed(new Runnable() {
                    @Override
                    public void run() {

                        Intent intent = new Intent(getApplicationContext(),
                                FaceCropActivity_dual.class);
                        // intent.putExtra("imagePath", imagePath);
                        intent.putExtra("imagePath", mImageUri.toString());
                        startActivity(intent);
                    }
                }, 500);
            }
            break;
    }
    }
3个回答

2
我使用了这段代码,它能够帮助我保存相机拍摄的图片并获取该图片的URI。
btnCamera.setOnClickListener(new OnClickListener() {

            @Override
            public void onClick(View v) {
                try {
                    dialog.dismiss();
                    SimpleDateFormat sdf = new SimpleDateFormat(
                            "yyyyMMdd_HHmmss");
                    String dt = sdf.format(new Date());

                    imageFile = null;
                    imageFile = new File(Environment
                            .getExternalStorageDirectory() + "/FrameFace/",
                            "Camera_" + dt + ".png");
                    Log.e("New Camera Image Path:-",
                            Environment.getExternalStorageDirectory()
                                    + "/FrameFace/" + "Camera_" + dt + ".png");

                    if (!imageFile.exists())
                        imageFile.createNewFile();

                    imagePath = Environment.getExternalStorageDirectory()
                            + "/FrameFace/" + "Camera_" + dt + ".png";

                    Uri outputFileUri = Uri.fromFile(imageFile);

                    Intent pictureActionIntent = new Intent(
                            android.provider.MediaStore.ACTION_IMAGE_CAPTURE);

                    pictureActionIntent.putExtra(MediaStore.EXTRA_OUTPUT,
                            outputFileUri);

                    startActivityForResult(pictureActionIntent, TAKE_PICTURE);
                } catch (Exception ex) {
                    ex.printStackTrace();
                }
            }
        });
@Override
    protected void onActivityResult(int requestCode, int resultCode,
            final Intent data) {
        super.onActivityResult(requestCode, resultCode, data);
        switch (requestCode) {
        case TAKE_PICTURE:
            Log.e("result code: ", Integer.toString(Activity.RESULT_OK) + " "
                    + Integer.toString(resultCode));

            if (resultCode == Activity.RESULT_OK) {
Handler h = new Handler();
                h.postDelayed(new Runnable() {
                    @Override
                    public void run() {

                        Intent intent = new Intent(getApplicationContext(),
                                FaceCropActivity_dual.class);
                        // intent.putExtra("imagePath", imagePath);
                        Log.e("Image Path-------------", "" + imagePath);
                        intent.putExtra("imagePath", imagePath);
                        startActivity(intent);
                    }
                }, 500);
            }
            break;
}
    }

0
imageFile = new File(Environment.getExternalStorageDirectory(),
                "FrameFace/" + "Camera_" + dt + ".png");

在这里,您可以一次性创建子目录和文件。您先创建目录,然后再创建图像文件。

更新 请尝试这个方法

 imageFile = new File(Environment.getExternalStorageDirectory()+"/FrameFace" ,"Camera_" + dt + ".png");

从onclick监听器中删除这个

         File photo = null;
            try {

                photo = SaveCameraImage();

            } catch (Exception e) {
                Log.e("Camera capture-------------",
                        "Can't create file to take picture!");
                Toast.makeText(SelectFrameActivity.this,
                        "Please check SD card! Image shot is impossible!",
                        10000).show();

            }

不,我已经在之前的活动中创建了名为“FrameFace”的目录。它运行良好。这里我只是创建一个新文件来保存图像。 - Zankhna
这并没有区别,因为它们都提供了相同的Uri。这不会解决我的问题。 - Zankhna

0

我创建了一个包装器来帮助你。在stackoverflow上查看整个讨论这里或在github上找到代码。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接