【问题标题】:Android get path of latest taken photoAndroid获取最新拍摄照片的路径
【发布时间】:2017-02-03 17:35:06
【问题描述】:

我正在从我的应用启动相机来拍照。它也可以在图库中找到。

常见的问题是如何知道照片的路径。建议的解决方案是:

  1. 自己保存路径,然后使用EXTRA_OUTPUT发送过来
  2. 从图库中的最后一张照片开始。

解决方案 1 isn't reliable.

我正在尝试使用以下代码使解决方案 2 工作:

public static String getTakenPhotoPath(Context context) {
    try {
        String[] projection = {MediaStore.Images.Media.DATA};
        Cursor cursor = context.getContentResolver().query(
                MediaStore.Images.Media.EXTERNAL_CONTENT_URI,
                projection, null, null, null);

        int column_index_data = cursor
                .getColumnIndexOrThrow(MediaStore.Images.Media.DATA);
        cursor.moveToLast();

        return cursor.getString(column_index_data);
    } catch (Exception ex) {
        ex.printStackTrace();

        return null;
    }
}

这不会返回最新照片的路径;它返回前一个。在询问最新照片的路径之前,我正在这样做:

private void addToGallery(Uri urlType, String path) {
    if (!Strings.isNullOrEmpty(path)) {
        ContentValues values = new ContentValues();
        // Add the date meta data to ensure the image is added at the front of the gallery
        values.put(MediaStore.Images.Media.DATE_ADDED, System.currentTimeMillis());
        values.put(MediaStore.Images.Media.DATE_TAKEN, System.currentTimeMillis());
        values.put(MediaStore.MediaColumns.DATA, path);

        getContentResolver().insert(urlType, values);

        Intent mediaScanIntent = new Intent(Intent.ACTION_MEDIA_SCANNER_SCAN_FILE);
        Uri contentUri = Uri.fromFile(new File(path));
        mediaScanIntent.setData(contentUri);
        sendBroadcast(mediaScanIntent);
    }
}

【问题讨论】:

  • 解决方案 2 的可靠性远不如解决方案 1。相机应用程序不需要将MediaStore 索引图像,更不用说及时这样做了。请参阅this answer 了解我推荐的ACTION_IMAGE_CAPTURE 分类。
  • 解决方案 1 是可靠的。我从未见过它失败。
  • @greenapps:您还没有看到 Stack Overflow 上的所有人都报告各种相机应用程序的问题。 ACTION_IMAGE_CAPTURE 根本没有经过太多测试,一些开发人员没有阅读有关 ACTION_IMAGE_CAPTURE 应该如何工作的文档。请参阅this rant of mine from 2015 了解更多信息。
  • 你为什么不直接打电话给你的Uri.getPath()onActivityResult
  • @CommonsWare 不是 CWAC cam -2 更好的选择吗?

标签: android android-camera-intent


【解决方案1】:

您可以这样做:当您打开相机时,您可以在给定的代码中传递您自己的首选位置,以便将来拍摄图像。而在onActivityResult你可以直接使用那个图片路径供你使用。

 File image ;
    Intent photoCaptureIntent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);
            File imagesFolder = new    File(Environment.getExternalStorageDirectory(), "MyImages");
            imagesFolder.mkdirs(); // <----
            image = new File(imagesFolder, getFileName());
            Uri uriSavedImage = Uri.fromFile(image);
            photoCaptureIntent.putExtra(MediaStore.EXTRA_OUTPUT, uriSavedImage);
            startActivityForResult(photoCaptureIntent, PICK_FROM_CAMERA);


    private String getFileName() {
            SimpleDateFormat formatter = new SimpleDateFormat("yyyy_MM_dd_HH_mm_ss");
            Date now = new Date();
            String fileName = formatter.format(now) + ".jpg";
            return fileName;
        }


@Override
    public void onActivityResult(int requestCode, int resultCode, Intent data) {
        try {
            setResult(resultCode, data);


            switch (requestCode) {
                case PICK_FROM_CAMERA:
                    try {
                        if (resultCode != RESULT_CANCELED) {
                            Intent upload = new Intent(EditProfile.this, ImageCropingFucAtivity.class);
                            prefs.edit().putBoolean("FromCamera", true).commit();
                            upload.putExtra(CropImage.IMAGE_PATH, image.toString());
                            upload.putExtra(CropImage.SCALE, true);
                            upload.putExtra(CropImage.ASPECT_X, 2);
                            upload.putExtra(CropImage.ASPECT_Y, 2);
                            startActivity(upload);
                            imageSelected = true;
                            finish();
                        }

                    } catch (Exception e) {
                        e.printStackTrace();
                    }

                    break;

                  }
        } catch (Exception e) {
            e.printStackTrace();
        }

    }

【讨论】:

  • 这不正是他的“解决方案1”吗?
  • 但这是他查询的解决方案,我在我的项目中使用它,它工作正常。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-01-20
  • 1970-01-01
  • 1970-01-01
  • 2011-03-30
  • 2012-08-30
  • 2013-01-14
相关资源
最近更新 更多