当前位置: 首页 > 知识库问答 >
问题:

如何从MediaStore获取位图?images . media . get bitmap(content resolver,uri)?

松骏俊
2023-03-14

我在从我的uri中检索位图时遇到困难。我试图通过Intent打开相机后从相机中获取图像。

                    try {
                        Intent intent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);
                        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) {
                            intent.setFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION);
                            imageUri = FileProvider.getUriForFile(mContext, mContext.getApplicationContext().getPackageName(), createImageFile());
                            intent.putExtra(MediaStore.EXTRA_OUTPUT, imageUri);   // set the image file name
                        }
                        startActivityForResult(intent, PERMISSION_REQUEST_CODE_CAMERA);
                    } catch (ActivityNotFoundException e) {
                        e.printStackTrace();
                    }

记录时的ImageUri是

content://com.example/external_files/Pictures/CustomFolder/15122017_photo_115344.jpg

打开相机并拍照后,将调用我的onActivityResult。因为我用的是MediaStore。EXTRA_OUTPUT我在我的数据对象中没有收到任何东西,因为它是空的。我尝试使用MediaStore.Images.Media。getBitmap()来检索位图。我传入imageUri。我认为这可能是错误的,因为我收到了一个例外。

@Override
public void onActivityResult(int requestCode, int resultCode, Intent data) {
    super.onActivityResult(requestCode, resultCode, data);

    if (requestCode == PERMISSION_REQUEST_CODE_CAMERA) {
        if (resultCode == Activity.RESULT_OK) {

            Bitmap bitmap;
            try {
                bitmap = MediaStore.Images.Media.getBitmap(mContext.getContentResolver(), imageUri);
                ivProfilePhoto.setImageBitmap(bitmap);
            } catch (FileNotFoundException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            } catch (IOException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }


        } else if (resultCode == Activity.RESULT_CANCELED){

        }
    }

我收到的例外是

java.io.FileNotFoundException:没有这样的文件或目录

编辑:

我可以保留这个文件,但是这个好像也不行。以下是我尝试过的。我更新了我的意图如下

                    try {
                        Intent intent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);
                        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) {
                            intent.setFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION);
                            mFile = createImageFile();
                            imageUri = FileProvider.getUriForFile(mContext, mContext.getApplicationContext().getPackageName(), mFile);
                            intent.putExtra(MediaStore.EXTRA_OUTPUT, imageUri);   // set the image file name
                        }
                        startActivityForResult(intent, PERMISSION_REQUEST_CODE_CAMERA);
                    } catch (ActivityNotFoundException e) {
                        e.printStackTrace();
                    }

然后在onActivityResult中,我执行以下操作

            Bitmap bitmap = BitmapFactory.decodeFile(mFile.getPath());
            ivProfilePhoto.setImageBitmap(bitmap);

没有为图像设置任何内容。此外,仅供参考,这就是我创建目录和设置文件图像名称的方式。

private File createImageFile() {
    File imgFileDir = getDir();
    if (!imgFileDir.exists() && !imgFileDir.mkdirs()) {
        Logger.e(TAG, "Directory does not exist");
        imgFileDir.mkdirs();
    }
    Logger.e("TEST", "imgFileDir= " + imgFileDir);
    // Locale.US to get local formatting
    SimpleDateFormat timeFormat = new SimpleDateFormat("hhmmss", Locale.US);
    SimpleDateFormat dateFormat = new SimpleDateFormat("ddMMyyyy", Locale.US);
    String time = timeFormat.format(new Date());
    String date = dateFormat.format(new Date());
    String photoFile = date + "_photo_" + time + ".jpg";
    filename = imgFileDir.getPath() + File.separator + photoFile;

    Logger.i(TAG, "time(hhmmss): " + time + " date(ddmmyyyy): " + date + "\nfilename: "
            + filename + " photoFile: " + photoFile);
    return new File(filename);
}

private File getDir() {
    File sdDir = Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_PICTURES);
    return new File(sdDir, "CustomFolder");
}

共有3个答案

史昀
2023-03-14

根据我的理解,你想从位图中获取uri,所以这段代码工作得非常好:-

 public Uri getImageUri(Context inContext, Bitmap inImage) {
    ByteArrayOutputStream bytes = new ByteArrayOutputStream();
    inImage.compress(Bitmap.CompressFormat.JPEG, 100, bytes);
    String path = MediaStore.Images.Media.insertImage(inContext.getContentResolver(), inImage, "Title", null);
    return Uri.parse(path);
}
盖成弘
2023-03-14

理想情况下,切换到使用图像加载库(例如Glide、Picasso),以便您的I/O和位图处理可以在后台线程上执行。

除此之外,按住File对象,而不是Uri,并使用File加载映像(例如,BitmapFactory.decodeFile())。这会更快,因为不会有ContentProvider开销。

贺皓
2023-03-14

这对我有用

val bitmap = MediaStore.Images.Media.getBitmap(this.getContentResolver(), uri);
 类似资料:
  • 我使用意图action_get_content调用startActivityForResult。有些应用程序返回给我的数据包含以下URI: 内容://media/external/images/media/18122 不知道是图像还是视频或者一些自定义内容。如何使用ContentResolver从这个URI获取实际的文件名或内容标题?

  • 问题内容: 如何从Uri获取Bitmap对象(如果我成功将其存储在 以在应用程序中使用它? 有谁知道如何实现这一目标? 问题答案: 这是正确的方法: 如果您需要加载非常大的图像,则以下代码会将其加载到图块中(避免大内存分配):

  • 因此,我有以下代码用于使用mediastore获取图像: 这是一个很好的获取图片文件夹中所有图片的工具,我想把它改为获取特定文件夹中的所有图片,这些图片将作为字符串传递。e、 g

  • 我想从获取图像:

  • 我正在尝试从我与ARCore的ARSession的当前帧中获取位图。但它总是等于空。我已经在网上搜索了好一阵子,但不能弄清楚我做错了什么。 我正在从我的的中获取,我使用它来显示相机图像。除了我的位图等于空之外,所有的工作都很好。 我正在使用一个按钮,这样就只使用了一个帧,如下所示: 、和都不等于NULL。 可能有问题吗? 多谢

  • 我不知道如何获得位图流使用Camerax。请给我提供一些信息。我不知道怎么做。