从uri Android API <19获取位图

时间:2019-01-29 15:37:24

标签: android android-camera-intent

我正在为应用编写自定义相机选择器。

这就是我管理相机意图的方式:

@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

我的应用拥有所需的所有权限


有人可以帮我吗?

4 个答案:

答案 0 :(得分:2)

这是来自 Android Developers documentation 的官方解决方案。

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 线程上完成此操作。

答案 1 :(得分:0)

尝试Glide,它在API级别14以上兼容

添加依赖项

Glide.with(this)
        .asBitmap()
        .load(path)
        .into(new SimpleTarget<Bitmap>() {
            @Override
            public void onResourceReady(Bitmap resource, Transition<? super Bitmap> transition) {
                imageView.setImageBitmap(resource);
            }
         });

然后添加您的代码

{{1}}

答案 2 :(得分:0)

另一个位置是内部存储。您可以在下面尝试

[ { property1: '<property-value-1>',
    property2: '<property-value-2>',
    property3: '<property-value-3>',
    property4: '<property-value-4>',    
    [Symbol(KEY)]:
     Key {
       namespace: undefined,
       id: <'id-value'>,
       kind: 'venue',
       path: [Getter] } } ]

答案 3 :(得分:0)

我找到了解决这个问题的方法。要获取Uri,您必须使用两种不同的方式: 1-在api 19及以下版本的操作页面上,您必须使用Uri.fromFile()和 2-对于api> 19,请使用 File Provider 。如果使用此说明,请始终使用

的方法
  

MediaStore.Images.Media.getBitmap()   工作正常,并返回您的位图。