美文网首页Android精选UtilsAndroid开发
Android 文件绝对路径和Content开头的Uri互相转换

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

作者: 青檬可乐 | 来源:发表于2016-09-06 09:39 被阅读16322次

    工作中遇到的问题。拍照获取图片后是得到的路径是

    file:///storage/emulated/0/Android/data/com.zehin.mingchuliangzao3/cache/PostPicture/20160905182015.jpg
    
    

    但是我想要的路径是:

    content://media/external/images/media/212304
    

    这种 Uri类型的

    查阅资料找到如下方法

    转Uri

    /**
         * Gets the content:// URI from the given corresponding path to a file
         * 
         * @param context
         * @param imageFile
         * @return content Uri
         */
        public static Uri getImageContentUri(Context context, java.io.File imageFile) {
            String filePath = imageFile.getAbsolutePath();
            Cursor cursor = context.getContentResolver().query(MediaStore.Images.Media.EXTERNAL_CONTENT_URI,
                    new String[] { MediaStore.Images.Media._ID }, MediaStore.Images.Media.DATA + "=? ",
                    new String[] { filePath }, null);
            if (cursor != null && cursor.moveToFirst()) {
                int id = cursor.getInt(cursor.getColumnIndex(MediaStore.MediaColumns._ID));
                Uri baseUri = Uri.parse("content://media/external/images/media");
                return Uri.withAppendedPath(baseUri, "" + id);
            } else {
                if (imageFile.exists()) {
                    ContentValues values = new ContentValues();
                    values.put(MediaStore.Images.Media.DATA, filePath);
                    return context.getContentResolver().insert(MediaStore.Images.Media.EXTERNAL_CONTENT_URI, values);
                } else {
                    return null;
                }
            }
        }
    

    Uri转绝对路径

    /** 
         * Gets the corresponding path to a file from the given content:// URI 
         * @param selectedVideoUri The content:// URI to find the file path from 
         * @param contentResolver The content resolver to use to perform the query. 
         * @return the file path as a string 
         */  
        public static String getFilePathFromContentUri(Uri selectedVideoUri,  
                ContentResolver contentResolver) {  
            String filePath;  
            String[] filePathColumn = {MediaColumns.DATA};  
      
            Cursor cursor = contentResolver.query(selectedVideoUri, filePathColumn, null, null, null);  
    //      也可用下面的方法拿到cursor  
    //      Cursor cursor = this.context.managedQuery(selectedVideoUri, filePathColumn, null, null, null);  
              
            cursor.moveToFirst();  
      
            int columnIndex = cursor.getColumnIndex(filePathColumn[0]);  
            filePath = cursor.getString(columnIndex);  
            cursor.close();  
            return filePath;  
        }  
    
    

    绝对路径转Uri的那个方法 目前是图片文件的转换 转其他文件 只要把content后面的目录换成对应文件的归属目录就行了。。

    相关文章

      网友评论

      • 艾特不出先生:转换失败
        青檬可乐: @艾特不出先生 看看楼下的评论
      • FendovyT_T:一点用没有,
        青檬可乐:@AlWays_MU 谢谢指点
        71a14d18c30d:@青檬可乐_ 不同的系统, 比如4.4以上, 会返回content uri. 低于这个版本的会返回file path.
        另外, 返回uri的, 当你使用不同的app来选取文件图像时, 也会返回不同的content, 用nexus自带的document时(似乎国产不会弹这个?), 会返回DocumentsContract.Document, 使用DocumentsContract.isDocumentUri(context, uri)来判断, 在document中又分从images目录,download目录, external storage目录这三个地方返回文件, 返回的uri都是不一样的; 如果不是document uri, 可以直接用你的方法
        青檬可乐:注意读取的参数是否拼对了
      • DuWei_Wang:有用
      • _Anonymous_:没用
        青檬可乐: @_Anonymous_ 注意读取的参数是否拼对了
      • Mr皓轩:你好,我通过contentResolver.query 获取到的Cursor 里面没有 _data 这列数据
        青檬可乐: @Mr皓轩 把取到的数据打印下看看 可能有的系统取到的数据不一样

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

      本文链接:https://www.haomeiwen.com/subject/lwldettx.html