拍摄图像在Android的MediaStore.ACTION_IMAGE_CAPTURE意图(cap

2019-06-18 13:35发布

我捕捉使用MediaStore.ACTION_IMAGE_CAPTURE意图的图像。 它在大多数设备的正常工作。 但它是不正确的一些最新的Android设备如预期工作。

我的本意是利用摄像机捕获图像,并将其发送到服务器,但不是到的图像存储在设备的默认画廊。

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

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所在

Answer 1:

由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年9月19日编辑:看来,有些相机应用程序忽略putExtra URI,和PIC存储在不同的地方。 因此,使用前值fileName ,你应该检查是否意图为空或不是。 如果你得到一个非空的意图,那么你应该更喜欢intent.getData()fileName 。 使用fileName的需要,只有当它备份解决方案。



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


文章来源: capturing images with MediaStore.ACTION_IMAGE_CAPTURE intent in android