从ACTION_IMAGE_CAPTURE意图中获取图像路径

25

您好,我正在使用ACTION_IMAGE_CAPTURE通过以下方式使用Intent来捕获图像:

Intent cameraIntent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);
cameraIntent.putExtra(
MediaStore.EXTRA_OUTPUT, (new File(Environment.getExternalStorageDirectory(),
String.valueOf(System.currentTimeMillis()) + ".jpg"))
);
startActivityForResult(cameraIntent, 0);

我需要将图像存储在SD卡中,并使用onActivityResult方法检索该图像的路径。 我不知道如何获取当前捕获图像的图像路径。

如果有人知道,请帮帮我。

谢谢


2
请将您的所有代码放在“代码”文本框中,这样阅读您的代码会更容易,以便我们能够回答您的问题。 - Samuel
4个回答

50

这就是在2.2上的工作方式(与之前的版本不同)。当启动意图时

        String fileName = "temp.jpg";  
        ContentValues values = new ContentValues();  
        values.put(MediaStore.Images.Media.TITLE, fileName);  
        mCapturedImageURI = getContentResolver().insert(MediaStore.Images.Media.EXTERNAL_CONTENT_URI, values);  

        Intent intent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);  
        intent.putExtra(MediaStore.EXTRA_OUTPUT, mCapturedImageURI);  
        startActivityForResult(intent, CAPTURE_PICTURE_INTENT);

你需要记住mCapturedImageURI

当你拍摄照片时,在onActivityResult()中使用该URI获取文件路径:

            String[] projection = { MediaStore.Images.Media.DATA}; 
            Cursor cursor = managedQuery(mCapturedImageURI, projection, null, null, null); 
            int column_index_data = cursor.getColumnIndexOrThrow(MediaStore.Images.Media.DATA); 
            cursor.moveToFirst(); 
            String capturedImageFilePath = cursor.getString(column_index_data);

更新: 在新的Android设备上,您不需要使用MediaStore.EXTRA_OUTPUT,而是可以从onActivityResult(...,Intent data)接收到的data.getData()中推断出图像/视频URI,如下链接所描述。

Android ACTION_IMAGE_CAPTURE Intent

但是,由于此部分受制于制造商的适应性,您仍然可能会遇到需要使用“旧”方法的手机。


1
谢谢您提供这个信息,但是在三星Galaxy I或II上无法运行。在HTC Incredible上只返回缩略图 :-( - Oh Danny Boy
很高兴我能帮忙。说实话,我也不确定它在所有2.2以上的平台上是如何工作的,所以任何额外的信息对我来说都很有价值。谢谢。 - Zelimir
@Nirav Ranpara - 你的代码运行在哪个Android平台版本上?在2.2以下,它的工作方式不同。你是否已经添加了相机和外部存储写入权限? - Zelimir
1
感谢您的回答。然而,如此处所述,managedQuery()现已过时。这里提供了一个简单的替代方案,即使用context.getContentResolver(),其中context是一个Context实例。 - Noha Kareem
但是同一张图片默认会保存两次,一次是默认名称,另一次是我们手动创建的文件名。 - Pranita Patil
显示剩余5条评论

7

另一种在Android 2.1上测试过的方法是获取相册中最后一张图片的ID或AbsolutePath。

可以像这样完成:

/**
 * 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;
    }
}

要删除文件:

private void removeImage(int id) {
       ContentResolver cr = getContentResolver();
        cr.delete(MediaStore.Images.Media.EXTERNAL_CONTENT_URI, MediaStore.Images.Media._ID + "=?", new String[]{ Long.toString(id) } );
}

这段代码是基于这篇帖子编写的:在相机意图拍照后删除相册中的图片


2

这个问题很老,但我已经为同样的问题奋斗了半天。问题在于,除非你在AndroidManifest.xml文件中为应用程序设置以下权限,否则你的ACTION_IMAGE_CAPTURE意图将始终返回code=-1data=null

<uses-permission android:name="android.permission.CAMERA"/>

如果您想从应用程序中记录音频,可以设置以下内容:

<uses-permission android:name="android.permission.RECORD_AUDIO"/>

2
在设置权限后,Nexus 4仍然返回code=-1和data=null。 - Brijesh Thakur

2

移除

intent.putExtra(MediaStore.EXTRA_OUTPUT, mCapturedImageURI);  

并添加

Uri uri = data.getData();in onActivityResult

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