【问题标题】:How to get Bitmap from MediaStore.Images.Media.getBitmap(contentResolver, uri)?如何从 MediaStore.Images.Media.getBitmap(contentResolver, uri) 获取位图?
【发布时间】:2017-12-15 20:05:05
【问题描述】:

我无法从我的 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);

没有为图像设置任何内容。此外,对于您的 FYI,这就是我创建目录和设置文件图像名称的方式。

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

【问题讨论】:

    标签: android bitmap android-camera-intent mediastore


    【解决方案1】:

    这对我有用

    val bitmap = MediaStore.Images.Media.getBitmap(this.getContentResolver(), uri);
    

    【讨论】:

      【解决方案2】:

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

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

      【讨论】:

      • 开销很大吗?我正在处理低规格设备,需要了解如何使用 BitmapFactory.decodeFile() 处理位图与 MediaStore.Images.Media.getBitmap(getContentResolver(), uriImg)
      • @ViVekH:我不知道你希望如何衡量“重要”。最后,两者都进行文件 I/O。但是,decodeFile() 只是进行文件 I/O。 getBitmap(),如果 uriImg 是来自您的应用程序的 FileProvider Uri,将执行相同的文件 I/O 以及 IPC。我不认为偶尔加载位图的开销会很大,但它会存在。
      【解决方案3】:

      根据我的理解,您想从位图中获取 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);
      }
      

      【讨论】:

      • 如果您仍然遇到问题,请发表评论,我会提供帮助。
      • 不,我想实际获取位图。我有图片 uri。
      • 您可以通过这种方式传递意图,然后 onactivity 会产生响应,您会得到 bitmap.Intent cameraIntent = new Intent(android.provider.MediaStore.ACTION_IMAGE_CAPTURE); startActivityForResult(cameraIntent, CAMERA_REQUEST); protected void onActivityResult(int requestCode, int resultCode, Intent data) { if (requestCode == CAMERA_REQUEST && resultCode == Activity.RESULT_OK) { Bitmap photo = (Bitmap) data.getExtras().get("data"); imageView.setImageBitmap(照片); } }
      • 如果我这样做,我会返回一个低质量的缩略图。
      【解决方案4】:

      添加这个

      public void onClick(View v) {   
          Intent intent = new Intent(Intent.ACTION_GET_CONTENT,MediaStore.Images.Media.EXTERNAL_CONTENT_URI);
              startActivityForResult(intent, 1);
      }
      

      当你用上面的代码替换你的代码时,自动你的这个

      public void onActivityResult(int requestCode, int resultCode,
      @Nullable Intent data){}
      

      方法将开始工作

      //No Need to write this code in onclick method
          Intent intent=new Intent();
          intent.setType("image/*");
          intent.setAction(Intent.ACTION_GET_CONTENT)
          startActivityForResult(intent,1);
          Toast.makeText(getContext(), "image"+intent, Toast.LENGTH_SHORT).show();
      

      【讨论】:

        猜你喜欢
        • 2012-10-27
        • 2011-04-22
        • 1970-01-01
        • 1970-01-01
        • 2019-12-24
        • 2012-09-15
        • 1970-01-01
        • 2014-07-31
        • 1970-01-01
        相关资源
        最近更新 更多