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

时间:2012-10-18 10:45:12

标签: android image android-intent capture

我正在使用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();
                }
            }

任何人都可以在这方面帮助我。

提前致谢。

Sathish所在

2 个答案:

答案 0 :(得分:32)

ACTION_IMAGE_CAPTURE拍摄的照片未在所有设备上自动在MediaStore中注册。

官方Android指南给出了这样的示例: http://developer.android.com/guide/topics/media/camera.html#intent-receive 但这在所有设备上都不起作用。

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

评论后编辑:

创建临时文件名,在启动意图时将存储照片。

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是否为null。如果您获得非空意图,那么您应该优先intent.getData()而不是fileName。仅在需要时才使用fileName作为备份解决方案。

答案 1 :(得分:4)

我的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");
    }
}