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-fs
的copyFile
方法将内容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类型的图片数据转换成流的主要内容,如果未能解决你的问题,请参考以下文章
使用 React-Native 将 content:// URI 转换为 Android 的实际路径