机器人:从URI真实路径 [英] android: Get real path from uri

查看:249
本文介绍了机器人:从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屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆