簡體   English   中英

從 uri Android API 獲取位圖 < 19

[英]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 中: file:///data/user/0/*****/files/images/image1548767548901.jpg
  • 在 API < 19 中:file:///data/data/*****/files/images/image1548767438290.jpg

在 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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM