从 ACTION_IMAGE_CAPTURE Intent 获取图像路径

Posted

技术标签:

【中文标题】从 ACTION_IMAGE_CAPTURE Intent 获取图像路径【英文标题】:Get Path of image from ACTION_IMAGE_CAPTURE Intent 【发布时间】:2011-05-10 06:07:38 【问题描述】:

您好,我正在使用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);

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

如果有人知道,请帮忙。

谢谢

【问题讨论】:

请将您的所有代码放在“代码”文本框中,这样阅读您的代码会更容易,因此我们可能无法回答您的问题 【参考方案1】:

这就是它在 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

但是,由于这部分取决于制造商的调整,您仍然可能会遇到“旧”方法可能有用的手机。

【讨论】:

感谢您,但不适用于三星 Galaxy I 或 II。返回 HTC Incredible 上的缩略图 :-( 在重新加载拍照活动并启动我的应用程序后,它显示“正在等待调试......”。有什么我错过的吗。在此处查看代码:***.com/questions/10510547/… 从 onActivityResult() 你可以得到 SD 卡上的真实姓名。 captureImageFilePath 有。 很高兴我能提供帮助。老实说,我也不确定它在所有 2.2 后的平台上如何工作,所以任何额外的信息对我来说也很有价值。问候。 感谢您的回答。但是,managedQuery() 现在已弃用,如 here 所述。 Here 是一个简单的替代方案;即改用context.getContentResolver();其中contextContext 实例。【参考方案2】:

在 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)  );

此代码基于帖子:Deleting a gallery image after camera intent photo taken

【讨论】:

【参考方案3】:

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

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

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

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

【讨论】:

在设置权限后,它在nexus 4上给出code=-1和data=null【参考方案4】:

删除

intent.putExtra(MediaStore.EXTRA_OUTPUT, mCapturedImageURI);  

并添加

Uri uri = data.getData();in onActivityResult

【讨论】:

以上是关于从 ACTION_IMAGE_CAPTURE Intent 获取图像路径的主要内容,如果未能解决你的问题,请参考以下文章

使用 ACTION_IMAGE_CAPTURE 从相机拍摄照片后如何跳过或避免“重拍并查看”选项

Android MediaStore.ACTION_IMAGE_CAPTURE 和 Intent.ACTION_PICK

使用 MediaStore.ACTION_IMAGE_CAPTURE 打开前置摄像头 [重复]

在 android 中使用 MediaStore.ACTION_IMAGE_CAPTURE 意图捕获图像

如何停止 MediaStore.ACTION_IMAGE_CAPTURE 复制图片

action_image_capture 重新启动应用程序