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

Posted

技术标签:

【中文标题】在 android 中使用 MediaStore.ACTION_IMAGE_CAPTURE 意图捕获图像【英文标题】:capturing images with MediaStore.ACTION_IMAGE_CAPTURE intent in android 【发布时间】:2012-10-08 19:19:49 【问题描述】:

我正在使用 MediaStore.ACTION_IMAGE_CAPTURE 意图捕获图像。它在大多数设备中运行良好。但它在某些最新的 android 设备中无法正常工作。

我的意图是使用相机捕获图像并将其发送到服务器,但不将该图像存储在设备的默认图库中。

**:当我捕获图像时,它在 onActivityResult 方法中返回一些其他画廊图像,而不是在某些最新的 android 设备中捕获的图像。 我正在使用下面的代码来捕获和存储图像。

public void launchCamera(View v) 
    Intent camera = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);
    startActivityForResult(camera, CAMERA_PIC_REQUEST );

在onActivityResult方法中,

String[] projection =  MediaStore.Images.ImageColumns.SIZE,
                    MediaStore.Images.ImageColumns.DISPLAY_NAME,
                    MediaStore.Images.ImageColumns.DATA, BaseColumns._ID, ;
            Cursor c = null;
            Uri u = MediaStore.Images.Media.EXTERNAL_CONTENT_URI;
            try 
                if (u != null) 
                    c = managedQuery(u, projection, null, null, null);
                
                if ((c != null) && (c.moveToLast())) 
                    Bitmap thumbnail = getBitMapFromLocalPath(c.getString(2), 3);
                    idsImagesgot.add(thumbnail);
                    ContentResolver cr = getContentResolver();
                    cr.delete( MediaStore.Images.Media.EXTERNAL_CONTENT_URI,
                            BaseColumns._ID + "=" + c.getString(3), null);
                
             finally 
                if (c != null) 
                    c.close();
                
            

谁能在这方面帮助我。

提前致谢。

萨蒂什

【问题讨论】:

【参考方案1】:

ACTION_IMAGE_CAPTURE 拍摄的照片不会在所有设备上自动注册到 MediaStore。

Android 官方指南给出了这个例子: http://developer.android.com/guide/topics/media/camera.html#intent-receive 但这并不适用于所有设备。

我知道的唯一可靠方法是将图片的路径保存在局部变量中。请注意,您的应用可能会在后台(相机应用运行时)被杀死,因此您必须在 onSaveInstanceState 期间保存路径。

评论后编辑:

创建一个临时文件名,启动 Intent 时将在其中存储照片。

File tempFile = File.createTempFile("my_app", ".jpg");
fileName = tempFile.getAbsolutePath();
Uri uri = Uri.fromFile(tempFile);
Intent intent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);
intent.putExtra(MediaStore.EXTRA_OUTPUT, uri);
startActivityForResult(intent, PICTURE_REQUEST_CODE);

fileName 是一个字符串,是您活动的一个字段。你必须这样保存它:

@Override
public void onSaveInstanceState(Bundle bundle)

 super.onSaveInstanceState(bundle);
 bundle.putString("fileName", fileName);

并在 onCreate() 中恢复它:

public void onCreate(Bundle savedInstanceState)

 if (savedInstanceState != null)
  fileName = savedInstanceState.getString("fileName");
 // ...

现在,在 onActivityResult 时,您知道存储照片的文件的名称 (fileName)。你可以用它做任何你想做的事,然后删除它。

2013-09-19 编辑:似乎某些相机应用程序忽略了 putExtra uri,并将图片存储在不同的位置。因此,在使用 fileName 的值之前,您应该检查意图是否为空。如果你得到一个非空意图,那么你应该更喜欢intent.getData() 而不是fileName。仅在需要时使用fileName 作为备份解决方案。

【讨论】:

感谢您的回复 Remi,如果可能的话,您能否指导我任何可行的方式来满足我上述要求? 嗨,雷米,感谢您的代码。我在上面使用相同的方法并提供捕获意图的 URI,在将我的图像保存到服务器后,我正在删除该临时图像,但该图像仍然在默认图库中可用.. 你能建议我如何删除文件默认图库。 如何删除文件?我想像getContentResolver().delete(uri, null, null); 这样的东西应该可以工作。 另外,这可能有用:***.com/questions/6390163/… 第一段代码第六行的PICTURE_REQUEST_CODE是什么?【参考方案2】:

我的 onActivityResult() 方法看起来像这样,它可以从 MediaStore.ACTION_IMAGE_CAPTURE 获取图像:

public void onActivityResult(int requestCode, int resultCode, Intent data) 
    if (resultCode == RESULT_OK) 
        Bundle extras = data.getExtras();
        Bitmap mImageBitmap = (Bitmap) extras.get("data");
    

【讨论】:

这将返回一个缩略图,而不是真实的图像。 @Markust 仔细看用户的原始问题。在他的代码中,他打算获取缩略图。 @Igor,尽管 OP 的意图是什么,您能否展示一个返回全尺寸图像的解决方案?这确实很有帮助。谢谢

以上是关于在 android 中使用 MediaStore.ACTION_IMAGE_CAPTURE 意图捕获图像的主要内容,如果未能解决你的问题,请参考以下文章

如何使用 MediaStore 在 Android Q 中保存图像?

无法在 android 中使用 MediaPlayer 播放 MediaStore.Audio 歌曲

在 Android Studio 中使用 MediaStore 来限制播放列表中的歌曲数量

错误记录Android 低版本使用分区存储错误 ( 低版本存储不得使用 MediaStore )

如何在 Android 上使用 MediaStore 将数据从相机保存到磁盘?

我们如何使用 MediaStore 类(ANDROID)获取所有包含图像的文件夹?