如何从MediaStore.Images.Media.getBitmap(contentResolver,uri)获取Bitmap?
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了如何从MediaStore.Images.Media.getBitmap(contentResolver,uri)获取Bitmap?相关的知识,希望对你有一定的参考价值。
我在从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 + "
filename: "
+ filename + " photoFile: " + photoFile);
return new File(filename);
}
private File getDir() {
File sdDir = Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_PICTURES);
return new File(sdDir, "CustomFolder");
}
理想情况下,切换到使用图像加载库(例如,Glide,Picasso),以便可以在后台线程上执行I / O和位图处理。
除此之外,抓住File
对象,而不是Uri
,并使用File
(例如,BitmapFactory.decodeFile()
)加载图像。这将更快,因为没有ContentProvider
开销。
根据我的理解,你想从位图中获取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);
}
以上是关于如何从MediaStore.Images.Media.getBitmap(contentResolver,uri)获取Bitmap?的主要内容,如果未能解决你的问题,请参考以下文章
如何将数据从回收器适配器发送到片段 |如何从 recyclerview 适配器调用片段函数
如何从服务器获取和设置 android 中的 API(从服务器获取 int 值)?如何绑定和实现这个