[英]method MediaStore.Images.Media.getBitmap(cr, uri); returns bitmap size exceeds VM budget
[英]How to get Bitmap from MediaStore.Images.Media.getBitmap(contentResolver, uri)?
我在從 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");
}
理想情況下,切換到使用圖像加載庫(例如 Glide、Picasso),以便您的 I/O 和位圖處理可以在后台線程上執行。
除此之外,保持File
對象,而不是Uri
,並使用File
(例如, BitmapFactory.decodeFile()
)加載圖像。 這會更快,因為沒有ContentProvider
開銷。
這對我有用
val bitmap = MediaStore.Images.Media.getBitmap(this.getContentResolver(), uri);
根據我的理解,您想從位圖中獲取 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);
}
添加這個
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();
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.