从相机意图结果获取路径和文件名

18

我想使用相机意图(camera intent)拍照,并将其保存到默认的DCIM文件夹中。然后,我想获取存储图片的路径/文件名。

我正在尝试使用以下代码:

Intent intent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);
startActivityForResult(intent, TAKE_PICTURE);

使用这段代码后,相机会打开并在拍摄一张照片后关闭并将照片保存到默认图像文件夹(通常是/dcim/camera或sdcard/dcim/camera...)

但现在我该如何获取已拍摄图片的路径和文件名? 我已经尝试了几乎所有在 onActivityResult 中的方法。

String result = data.getData();

并且

String result = data.getDataString();

并且

String result = data.toURI();

并且

Uri uri = data.getData();

过去两天我一直在研究这个问题,网络上和stackoverflow上有很多文章但都不起作用。我不想要缩略图,只想要相机拍摄的图片的路径(uri?)。

感谢任何帮助。

编辑:当我尝试:

path=Environment.DIRECTORY_DCIM + "/test.jpg";
File file = new File(path);
Uri outputFileUri = Uri.fromFile(file);
Intent intent = new Intent(android.provider.MediaStore.ACTION_IMAGE_CAPTURE);
intent.putExtra(MediaStore.EXTRA_OUTPUT, outputFileUri);
startActivityForResult(intent, TAKE_PICTURE); 

它不会将图像存储为test.jpg,而是使用普通的图像名称2011-10-03.....jpg(但这也可以,我只需要图像的路径,无论名称是什么都没关系)。

最好的问候

再次编辑

path=Environment.getExternalStorageDirectory().getPath() + "/DCIM/Camera/";
File file = new File(path,"test111111111.jpg");
try {
file.createNewFile();
} catch (IOException e) {
e.printStackTrace();
}
Uri outputFileUri = Uri.fromFile(file);
Intent intent = new Intent(android.provider.MediaStore.ACTION_IMAGE_CAPTURE);
intent.putExtra(MediaStore.EXTRA_OUTPUT, outputFileUri);

startActivityForResult(intent, TAKE_PICTURE); 

我尝试了这个方法,它将图像存储到正确的文件夹中,并给定了名称(例如test111111.jpg)。 但是我现在该如何在onActivityResult中获取文件路径呢?


6
您已经知道了路径...... 因为您创建了文件。 您可以将文件或路径作为Activity的成员变量保留。 - Ovidiu Latcu
3个回答

6

这张图片将会被存储两次,首先在相册文件夹中,然后在使用putExtra(MediaStore.EXTRA_OUTPUT, path)方法指定的文件中。

你可以通过以下方式获取最后一张拍摄的照片:

/**
 * Gets the last image id from the media store
 * @return
 */
private int getLastImageId(){
    final String[] imageColumns = { MediaStore.Images.Media._ID, MediaStore.Images.Media.DATA };
    final String imageOrderBy = MediaStore.Images.Media._ID+" DESC";
    Cursor imageCursor = managedQuery(MediaStore.Images.Media.EXTERNAL_CONTENT_URI, imageColumns, null, null, imageOrderBy);
    if(imageCursor.moveToFirst()){
        int id = imageCursor.getInt(imageCursor.getColumnIndex(MediaStore.Images.Media._ID));
        String fullPath = imageCursor.getString(imageCursor.getColumnIndex(MediaStore.Images.Media.DATA));
        Log.d(TAG, "getLastImageId::id " + id);
        Log.d(TAG, "getLastImageId::path " + fullPath);
        imageCursor.close();
        return id;
    }else{
        return 0;
    }
}

这个示例是基于这篇文章的: 在拍照后删除相册中的图片


1
嘿,这段代码在三星平板上可以运行,但在联想和i-ball平板上无法运行,有其他解决方案吗? - Shubham

1

在onActivityResult()中,你可以像这样使用:

if(requestCode==CAMERA_CAPTURE)
    {

        Cursor cursor = getContentResolver().query(Media.EXTERNAL_CONTENT_URI, new String[]{Media.DATA, Media.DATE_ADDED, MediaStore.Images.ImageColumns.ORIENTATION}, Media.DATE_ADDED, null, "date_added ASC");
        if(cursor != null && cursor.moveToFirst())
        {
            do 
            {
                String picturePath =cursor.getString(cursor.getColumnIndex(Media.DATA));
               Uri selectedImage = Uri.parse(picturePath);

            }
            while(cursor.moveToNext());
                cursor.close();
            File out = new File(picturePath);
            try 
            {
                mOriginal = decodeFile(out);
            }
            catch (IOException e)
            {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }


            mSelected.setImageBitmap(mOriginal);
        }
    }

0

当您启动 ACTION_IMAGE_CAPTURE 时,可以传递额外的 MediaStore.EXTRA_OUTPUT 作为您想要保存图片的文件的 URI

这里是一个简单的例子:

   File file = new File(path);
   Uri outputFileUri = Uri.fromFile(file);

   Intent intent = new Intent(android.provider.MediaStore.ACTION_IMAGE_CAPTURE);
   intent.putExtra(MediaStore.EXTRA_OUTPUT, outputFileUri);

   startActivityForResult(intent, TAKE_PICTURE); 

编辑:我刚在我的设备上尝试了一下,file.createNewFile()解决了我的问题。


嗨,谢谢您的快速回复,但它没有按照预期的方式工作。我会在上面解释。 - bihcoder
也许这是一个愚蠢的问题...您在Manifest中添加了权限吗?android.permission.CAMERA? 是的...有时它可以在没有权限的情况下工作。 - Ovidiu Latcu
是的,我已经添加了权限。我只需要知道相机保存照片的路径。我知道路径是默认图片文件夹,所以实际上我只需要文件名或最新拍摄照片的路径。我已经寻找两天了,但还没有解决方案。 - bihcoder

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