机器人:从URI真实路径 [英] android: Get real path from uri
本文介绍了机器人:从URI真实路径的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!
问题描述
我想仙文件到服务器,我需要从URI真实路径。
我的code:
公共字符串getPathFromURI(上下文的背景下,乌里contentUri){
如果(contentUri.toString()的indexOf(文件:///)-1个){
返回contentUri.getPath();
} 光标光标= NULL;
尝试{
的String [] = PROJ {MediaStore.Images.Media.DATA};
光标= context.getContentResolver()查询(contentUri,凸出,NULL,NULL,NULL);
INT与Column_Index = cursor.getColumnIndexOrThrow(MediaStore.Images.Media.DATA);
cursor.moveToFirst();
返回cursor.getString(Column_Index中);
} {最后
如果(指针!= NULL){
cursor.close();
}
}
}
和的onActivityResult:
...
imageName = data.getData();
的ImagePath = getPathFromURI(getBaseContext(),imageName);。Picasso.with(getBaseContext())负载(imageName).into(ImageView的);
...
怎么可能是图像显示在ImageView的,但的ImagePath始终为空? :)谢谢
编辑:
我如何发送图像到服务器
的HttpClient HttpClient的=新DefaultHttpClient();
HttpContext的localContext =新BasicHttpContext();
HttpPost httpPost =新HttpPost([URL到服务器]);MultipartEntity实体=新MultipartEntity(HttpMultipartMode.BROWSER_COMPATIBLE);
entity.addPart(uploaded_file_1,新FileBody(新文件(的ImagePath)));httpPost.setEntity(实体);
httpClient.execute(httpPost,localContext);
解决方案
我通过堆栈一些答案了,并找到了解决办法...
公共静态字符串getPathFromURI(最终上下文的背景下,最终乌里URI){ 最终布尔isKitKat = Build.VERSION.SDK_INT> = Build.VERSION_ codeS.KITKAT; // DocumentProvider
如果(isKitKat&放大器;&放大器; DocumentsContract.isDocumentUri(上下文,URI)){
// ExternalStorageProvider
如果(isExternalStorageDocument(URI)){
最后弦乐的docId = DocumentsContract.getDocumentId(URI);
最终的String [] =拆分docId.split(:);
最终字符串类型=拆分[0]; 如果(主.equalsIgnoreCase(类型)){
返回Environment.getExternalStorageDirectory()+/+割裂[1];
}
}
// DownloadsProvider
否则如果(isDownloadsDocument(URI)){ 最后弦乐ID = DocumentsContract.getDocumentId(URI);
最后乌里contentUri = ContentUris.withAppendedId(Uri.parse(内容://下载/ public_downloads),Long.valueOf(ID)); 返回getDataColumn(背景下,contentUri,NULL,NULL);
}
// MediaProvider
否则如果(isMediaDocument(URI)){
最后弦乐的docId = DocumentsContract.getDocumentId(URI);
最终的String [] =拆分docId.split(:);
最终字符串类型=拆分[0]; 乌里contentUri = NULL;
如果(形象.equals(类型)){
contentUri = MediaStore.Images.Media.EXTERNAL_CONTENT_URI;
}否则如果(视频.equals(类型)){
contentUri = MediaStore.Video.Media.EXTERNAL_CONTENT_URI;
}否则如果(音频.equals(类型)){
contentUri = MediaStore.Audio.Media.EXTERNAL_CONTENT_URI;
} 最后弦乐选择=_id =?;
最终的String [] = selectionArgs两个新的String [] {
分裂[1]
}; 返回getDataColumn(背景下,contentUri,选择selectionArgs两个);
}
}
// MediaStore(和一般)
否则,如果(内容.equalsIgnoreCase(uri.getScheme())){
返回getDataColumn(背景下,URI,NULL,NULL);
}
//文件
否则,如果(文件.equalsIgnoreCase(uri.getScheme())){
返回uri.getPath();
} 返回null;
}公共静态字符串getDataColumn(上下文的背景下,开放的URI,字符串的选择,
的String [] selectionArgs两个){ 光标光标= NULL;
最后String列=_data;
最终的String [] =投影{
柱
}; 尝试{
光标= context.getContentResolver()查询(URI,投影,选择,selectionArgs两个,
空值);
如果(光标=空&放大器;!&放大器; cursor.moveToFirst()){
最终诠释与Column_Index = cursor.getColumnIndexOrThrow(列);
返回cursor.getString(Column_Index中);
}
} {最后
如果(指针!= NULL)
cursor.close();
}
返回null;
}公共静态布尔isExternalStorageDocument(URI URI){
返回com.android.externalstorage.documents.equals(uri.getAuthority());
}公共静态布尔isDownloadsDocument(URI URI){
返回com.android.providers.downloads.documents.equals(uri.getAuthority());
}公共静态布尔isMediaDocument(URI URI){
返回com.android.providers.media.documents.equals(uri.getAuthority());
}
这会发现即使是奇巧每一种情况下(这是问题...奇巧)
的真实路径I want to sen file to server and I need to get real path from uri.
My code:
public String getPathFromURI(Context context, Uri contentUri) {
if ( contentUri.toString().indexOf("file:///") > -1 ){
return contentUri.getPath();
}
Cursor cursor = null;
try {
String[] proj = { MediaStore.Images.Media.DATA };
cursor = context.getContentResolver().query(contentUri, proj, null, null, null);
int column_index = cursor.getColumnIndexOrThrow(MediaStore.Images.Media.DATA);
cursor.moveToFirst();
return cursor.getString(column_index);
}finally {
if (cursor != null) {
cursor.close();
}
}
}
And onActivityResult:
...
imageName = data.getData();
imagePath = getPathFromURI(getBaseContext(),imageName);
Picasso.with(getBaseContext()).load(imageName).into(imageView);
...
How it's possible that image shows in ImageView , but imagePath is ALWAYS null ? :) Thanks
EDIT:
How i send image to server
HttpClient httpClient = new DefaultHttpClient();
HttpContext localContext = new BasicHttpContext();
HttpPost httpPost = new HttpPost([URL TO A SERVER]);
MultipartEntity entity = new MultipartEntity(HttpMultipartMode.BROWSER_COMPATIBLE);
entity.addPart("uploaded_file_1", new FileBody(new File( imagePath )));
httpPost.setEntity(entity);
httpClient.execute(httpPost, localContext);
解决方案
I went through some answers on stack, and found the solution...
public static String getPathFromURI(final Context context, final Uri uri) {
final boolean isKitKat = Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT;
// DocumentProvider
if (isKitKat && DocumentsContract.isDocumentUri(context, uri)) {
// ExternalStorageProvider
if (isExternalStorageDocument(uri)) {
final String docId = DocumentsContract.getDocumentId(uri);
final String[] split = docId.split(":");
final String type = split[0];
if ("primary".equalsIgnoreCase(type)) {
return Environment.getExternalStorageDirectory() + "/" + split[1];
}
}
// DownloadsProvider
else if (isDownloadsDocument(uri)) {
final String id = DocumentsContract.getDocumentId(uri);
final Uri contentUri = ContentUris.withAppendedId(Uri.parse("content://downloads/public_downloads"), Long.valueOf(id));
return getDataColumn(context, contentUri, null, null);
}
// MediaProvider
else if (isMediaDocument(uri)) {
final String docId = DocumentsContract.getDocumentId(uri);
final String[] split = docId.split(":");
final String type = split[0];
Uri contentUri = null;
if ("image".equals(type)) {
contentUri = MediaStore.Images.Media.EXTERNAL_CONTENT_URI;
} else if ("video".equals(type)) {
contentUri = MediaStore.Video.Media.EXTERNAL_CONTENT_URI;
} else if ("audio".equals(type)) {
contentUri = MediaStore.Audio.Media.EXTERNAL_CONTENT_URI;
}
final String selection = "_id=?";
final String[] selectionArgs = new String[] {
split[1]
};
return getDataColumn(context, contentUri, selection, selectionArgs);
}
}
// MediaStore (and general)
else if ("content".equalsIgnoreCase(uri.getScheme())) {
return getDataColumn(context, uri, null, null);
}
// File
else if ("file".equalsIgnoreCase(uri.getScheme())) {
return uri.getPath();
}
return null;
}
public static String getDataColumn(Context context, Uri uri, String selection,
String[] selectionArgs) {
Cursor cursor = null;
final String column = "_data";
final String[] projection = {
column
};
try {
cursor = context.getContentResolver().query(uri, projection, selection, selectionArgs,
null);
if (cursor != null && cursor.moveToFirst()) {
final int column_index = cursor.getColumnIndexOrThrow(column);
return cursor.getString(column_index);
}
} finally {
if (cursor != null)
cursor.close();
}
return null;
}
public static boolean isExternalStorageDocument(Uri uri) {
return "com.android.externalstorage.documents".equals(uri.getAuthority());
}
public static boolean isDownloadsDocument(Uri uri) {
return "com.android.providers.downloads.documents".equals(uri.getAuthority());
}
public static boolean isMediaDocument(Uri uri) {
return "com.android.providers.media.documents".equals(uri.getAuthority());
}
This will find the real path in every case even for kitkat (that was the problem... kitkat)
这篇关于机器人:从URI真实路径的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!
查看全文