[英]Get bitmap from uri Android API < 19
我正在為應用程序編寫自定義相機選擇器。
這就是我管理相機意圖的方式:
@SuppressWarnings("ResultOfMethodCallIgnored")
@NonNull
private Intent getCameraIntent()
{
mCurrentImageFileName = "image" + System.currentTimeMillis() + ".jpg"; // create a default jpg image
File imagesDir = new File( mActivity.getFilesDir(), "images"); // init a images directory creation
imagesDir.mkdirs(); // create images directory
File vFile = new File( imagesDir, mCurrentImageFileName );
try { vFile.createNewFile(); } catch (IOException e) { e.printStackTrace(); }
Intent vCameraIntent = new Intent( MediaStore.ACTION_IMAGE_CAPTURE ); // init the default camera intent
String vAuthority = mActivity.getPackageName() + ".******"; // get path authority ( used to filter a specific folder )
final Uri outputUri;
if( Build.VERSION.SDK_INT <= Build.VERSION_CODES.KITKAT ) { outputUri = Uri.fromFile( vFile ); } // fix kitkat issue
else { outputUri = FileProvider.getUriForFile( mActivity.getApplicationContext(), vAuthority, vFile ); }
vCameraIntent.putExtra( MediaStore.EXTRA_OUTPUT, outputUri );
LogUtils.setDebugLog( "debugOutputUri %s", "output uri is : " + outputUri );
mActivity.grantUriPermission(
"com.google.android.GoogleCamera",
outputUri,
Intent.FLAG_GRANT_WRITE_URI_PERMISSION | Intent.FLAG_GRANT_READ_URI_PERMISSION
);
return vCameraIntent;
}
以及我如何處理結果以獲取位圖:
Bitmap vBitmap = MediaStore.Images.Media.getBitmap( mActivity.getContentResolver(), vImageUri ); // get bitmap
vImageUri 是:
在 API > 19 getBitmap 中運行良好,但在 API < 19 getBitmap 中總是返回 null 。
我的應用程序具有所需的所有權限
有人可以幫我嗎?
這是Android Developers 文檔中的官方解決方案。
private Bitmap getBitmapFromUri(Uri uri) throws IOException {
ParcelFileDescriptor parcelFileDescriptor = context.getContentResolver().openFileDescriptor(uri, "r");
FileDescriptor fileDescriptor = parcelFileDescriptor.getFileDescriptor();
Bitmap image = BitmapFactory.decodeFileDescriptor(fileDescriptor);
parcelFileDescriptor.close();
return image;
}
筆記:
您應該在后台線程而不是 UI 線程上完成此操作。
試試 Glide,它兼容 API 級別 14 以上
添加依賴項
dependencies {
implementation 'com.github.bumptech.glide:glide:4.8.0'
annotationProcessor 'com.github.bumptech.glide:compiler:4.8.0'
}
然后添加你的代碼
Glide.with(this)
.asBitmap()
.load(path)
.into(new SimpleTarget<Bitmap>() {
@Override
public void onResourceReady(Bitmap resource, Transition<? super Bitmap> transition) {
imageView.setImageBitmap(resource);
}
});
另一個位置是內部存儲。你可以試試下面的
ContextWrapper cw = new ContextWrapper(context);
//path to /data/data/yourapp/app_data/dirName
File directory = cw.getDir("dirName", Context.MODE_PRIVATE);
File mypath=new File(directory,"imagename.jpg");
Bitmap b = BitmapFactory.decodeStream(new FileInputStream(mypath));
我找到了解決此問題的方法。要獲取 Uri,您必須使用兩種不同的方式:1- 在 api 19 及以下的操作頁面中,您必須使用Uri.fromFile()
和 2- 對於 api > 19 請使用File Provider 。如果您使用這個指令,總是的方法
MediaStore.Images.Media.getBitmap() 工作正常並返回您的位圖。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.