android:怎样将Uri类型的图片数据转换成流

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了android:怎样将Uri类型的图片数据转换成流相关的知识,希望对你有一定的参考价值。

我在获取到手机本地图片的时候使用了这个方法
switch (view.getId())
case R.id.activity_changepersonaldata_image:
Intent intent=new Intent(Intent.ACTION_PICK,null);
intent.setDataAndType(MediaStore.Images.Media.EXTERNAL_CONTENT_URI,"image/*");
startActivityForResult(intent, 0x1);
break;


@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data)
// TODO Auto-generated method stub
if (requestCode == 0x1 && resultCode == RESULT_OK)
if (data != null)
//data.getData为Uri类型
photo=data.getData().toString();
image.setImageURI(data.getData());


super.onActivityResult(requestCode, resultCode, data);

目的是点击图片获取到手机的本地图片数据,我获取到的数据data.getData()的是Uri类型的数据。我想问的问题是怎样把获取到的Uri类型的数据data.getData()传到后台接口中去呢,顺便说一下,我在向后台传送数据的时候使用的网络请求时OkHttpUtils的post方式请求的。是不是需要在.addParams()方法中传到参数类型要转换成流的形式。

ContentResolver resolver = getContentResolver();

Cursor cursor = resolver.query(originalUri, proj, null, null, null);
// 按我个人理解 这个是获得用户选择的图片的索引值
int column_index = cursor.getColumnIndexOrThrow(MediaStore.Images.Media.DATA);
// 将光标移至开头 ,这个很重要,不小心很容易引起越界
cursor.moveToFirst();
// 最后根据索引值获取图片路径
String path = cursor.getString(column_index);

这样就获得了图片的路径。

下面说图片上传,现在一般上传都用Okhttp 框架了,直接上传个File类就可以,不需要自己在转成数据流,给你个连接,我写的工具类,你也可以查一下,这个很方便http://blog.csdn.net/xihe9152/article/details/68485040,使用前需要先依赖Okhttp3


参考技术A 大3岁的女生

使用 React-Native 将 content:// URI 转换为 Android 的实际路径

【中文标题】使用 React-Native 将 content:// URI 转换为 Android 的实际路径【英文标题】:Convert content:// URI to actual path for Android using React-Native 【发布时间】:2016-03-28 09:19:49 【问题描述】:

我正在尝试从cameraRoll 上传图片。事情是 cameraRoll 组件返回 content:// URI 而不是实际的文件路径。为了上传图片我需要一个文件路径,有没有办法将 content:// URI 转换为文件 URI?谢谢

【问题讨论】:

为什么需要路径?例如,您不能使用InputStream 吗? 我正在开发一个 React-Native 应用程序,使用 Java 方法有点麻烦,所以我正在寻找一个 React Native 解决方案。谢谢 【参考方案1】:

我把@Madhukar Hebbar提交的函数拿来做成了一个React Native Node Module。

你可以在这里找到它:react-native-get-real-path

从而实现你想要的,可以结合react-native-fs使用上面的模块

当您想从相机胶卷上传所选图像时,您可以执行以下操作:

RNGRP.getRealPathFromURI(this.state.selectedImageUri).then(path =>
  RNFS.readFile(path, 'base64').then(imageBase64 =>
    this.props.actions.sendImageAsBase64(imageBase64)
  )
)

【讨论】:

你是救世主!只有一个问题 - 因为它仅适用于 android - 需要将 require 包行放在平台检查逻辑中。但是与它提供的实用程序相比 - 我可以忽略这一点。 :-) 我使用了你的库,但没有用。我收到undefined is not a function(reactNativeGetRealPath2.default.getRealPathFromUri(path)) 的错误,我给出的路径是content://com.google.android.apps.photos.contentprovider/-1/1/content%3A%2F%2Fmedia%2Fexternal%2Fimages%2Fmedia%2F890/ORIGINAL/NONE/225703422 有没有同时支持ios和android的库【参考方案2】:

您可以使用react-native-fscopyFile方法将内容uri转换为文件uri。

if (url.startsWith('content://')) 
    const urlComponents = url.split('/')
    const fileNameAndExtension = urlComponents[urlComponents.length - 1]
    const destPath = `$RNFS.TemporaryDirectoryPath/$fileNameAndExtension`
    await RNFS.copyFile(url, destPath)

那么你就可以按预期使用'file://' + destPath

【讨论】:

请注意: 1. 代码中有几个变量名错误。 2. 如果您的文件名中有“%”符号,则不会上传。所以,替换这些字符。【参考方案3】:

content:// URI传递给下面的方法,以字符串形式获取文件路径,然后使用文件对象进行任何操作。

File file = new File(getURIPath(uriValue));

/**
 * URI Value
 * @return File Path.
 */
String getURIPath(Uri uriValue) 
    
        String[] mediaStoreProjection =  MediaStore.Images.Media.DATA ;
        Cursor cursor = getContentResolver().query(uriValue, mediaStoreProjection, null, null, null);
        if (cursor != null) 
        int colIndex = cursor.getColumnIndexOrThrow(MediaStore.Images.Media.DATA);
        cursor.moveToFirst();
        String colIndexString=cursor.getString(colIndex);
        cursor.close();
        return colIndexString;
        
        return null;
    

【讨论】:

如何更改此功能以处理所有文件类型,如文档和视频文件?

以上是关于android:怎样将Uri类型的图片数据转换成流的主要内容,如果未能解决你的问题,请参考以下文章

Java 图片二进制数据转换成流输出请求解答

使用 React-Native 将 content:// URI 转换为 Android 的实际路径

android如何通过path得到uri?

Android 文件绝对路径和Content开头的Uri互相转换

android图片文件的路径地址与Uri的相互转换

Android实战简易教程-第二十八枪(Uri转String型实例)