如何从MediaStore.Images.Media.getBitmap(contentResolver,uri)获取位图?

时间:2017-12-15 20:05:05

标签: android bitmap android-camera-intent mediastore

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

                    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是

  

内容://com.example/external_files/Pictures/CustomFolder/15122017_photo_115344.jpg

打开相机并拍照后,我的onActivityResult被调用。因为我使用MediaStore.EXTRA_OUTPUT我在数据对象中没有收到任何内容,所以它为null。我尝试使用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");
}

4 个答案:

答案 0 :(得分:2)

这对我有用

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

答案 1 :(得分:1)

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

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

答案 2 :(得分:0)

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

if __name__ == '__main__':
        #test_list = ('apple', 'banana', 'CranBerry', 'dogwood', 'alpha', 'Acorn', 'Anise', 'crannotberry' )
        #test(test_list)

        connection = sqlite3.connect('my_sqliteDB')
        cur = connection.cursor()
        cur.execute("select stock_item_name from inventory")
        sqloutput = cur.fetchall()  #This contains the SQL output in format [(u'data1',), (u'data2',), (u'data3',)]
        sqloutput_2 = [item[0] for item in sqloutput]  #This is manipulated to the format [u'data1',u'data2',u'data3']
        test_list = tuple(map(str, sqloutput_2))  #This will remove the unicode data and final format [data1,data2,data3]
        test(test_list) #The final format works with values in DB.

答案 3 :(得分:0)

添加此

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();