11

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

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

提前致谢。

萨蒂什

4

2 回答 2

34

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需要时用作备份解决方案。

于 2012-10-18T11:32:49.650 回答
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");
    }
}
于 2014-01-07T22:17:37.563 回答