Android应用开发Android Uri,Path与File的之间转换
白羽 2019-02-25 来源 :网络 阅读 3366 评论 0

摘要:本文将带你了解Android应用开发Android Uri,Path与File的之间转换,希望本文对大家学Android有所帮助。

    本文将带你了解Android应用开发Android Uri,Path与File的之间转换,希望本文对大家学Android有所帮助。


Android应用开发Android Uri,Path与File的之间转换


Android   Uri,Path与File的相互转换(新)
    一、path->file
   
 
    File file = new File(path);
    二、 file->path
   
 
    String path = file.getPath();
    注意URI和Uri的区别
    1 URI:是java.net的子类
    2 Uri :是android.net的子类,Uri 不能被实例化
   
    三、 URI->File
   

    File file = null;   //图片地址
            try {
                file = new File(new   URI(uri.toString()));
            } catch (URISyntaxException   e) {
                  e.printStackTrace();
            }
    四、 File->URI
   
 
    URI uri = file.toURI();
    五、 Path->Uri
   
 
    Uri uri = Uri.parse(path);
    六、Uri->Path
    网上很多通过context.getContentResolver().query方式可能会遇到空指针的问题
    提供的封装方法 去处理Uri转Path的问题
   
    传入 context 和 Uri即可
   
  
    public class UriTofilePath {
        public static String   getFilePathByUri(Context context, Uri uri) {
            String path = null;
            // 以 file:// 开头的
            if   (ContentResolver.SCHEME_FILE.equals(uri.getScheme())) {
                path =   uri.getPath();
                return path;
            }
            // 以 content:// 开头的,比如   content://media/extenral/images/media/17766
            if   (ContentResolver.SCHEME_CONTENT.equals(uri.getScheme()) &&   Build.VERSION.SDK_INT < Build.VERSION_CODES.KITKAT) {
                Cursor cursor =   context.getContentResolver().query(uri, new   String[]{MediaStore.Images.Media.DATA}, null, null, null);
                if (cursor != null) {
                    if   (cursor.moveToFirst()) {
                        int columnIndex =   cursor.getColumnIndexOrThrow(MediaStore.Images.Media.DATA);
                        if (columnIndex   > -1) {
                            path =   cursor.getString(columnIndex);
                        }
                    }
                    cursor.close();
                }
                return path;
            }
            // 4.4及之后的 是以 content://   开头的,比如   content://com.android.providers.media.documents/document/image%3A235700
            if   (ContentResolver.SCHEME_CONTENT.equals(uri.getScheme()) &&   Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT) {
                if (DocumentsContract.isDocumentUri(context,   uri)) {
                    if   (isExternalStorageDocument(uri)) {
                        //   ExternalStorageProvider
                        final String   docId = DocumentsContract.getDocumentId(uri);
                        final String[]   split = docId.split(":");
                        final String type   = split[0];
                        if   ("primary".equalsIgnoreCase(type)) {
                            path =   Environment.getExternalStorageDirectory() + "/" + split[1];
                            return   path;
                        }
                    } else if   (isDownloadsDocument(uri)) {
                        //   DownloadsProvider
                        final String id =   DocumentsContract.getDocumentId(uri);
                        final Uri   contentUri =   ContentUris.withAppendedId(Uri.parse("content://downloads/public_downloads"),
                                  Long.valueOf(id));
                        path =   getDataColumn(context, contentUri, null, null);
                        return   path;
                    } else if   (isMediaDocument(uri)) {
                        //   MediaProvider
                        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]};
                        path =   getDataColumn(context, contentUri, selection, selectionArgs);
                        return   path;
                    }
                }
            }
            return null;
        }
     
        private 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;
        }
     
        private static boolean isExternalStorageDocument(Uri   uri) {
            return   "com.android.externalstorage.documents".equals(uri.getAuthority());
    body{ }    

本文由职坐标整理并发布,希望对同学们有所帮助。了解更多详情请关注职坐标移动开发之Android频道!

本文由 @白羽 发布于职坐标。未经许可,禁止转载。
喜欢 | 1 不喜欢 | 0
看完这篇文章有何感觉?已经有1人表态,100%的人喜欢 快给朋友分享吧~
评论(0)
后参与评论

您输入的评论内容中包含违禁敏感词

我知道了

助您圆梦职场 匹配合适岗位
验证码手机号,获得海同独家IT培训资料
选择就业方向:
人工智能物联网
大数据开发/分析
人工智能Python
Java全栈开发
WEB前端+H5

请输入正确的手机号码

请输入正确的验证码

获取验证码

您今天的短信下发次数太多了,明天再试试吧!

提交

我们会在第一时间安排职业规划师联系您!

您也可以联系我们的职业规划师咨询:

小职老师的微信号:z_zhizuobiao
小职老师的微信号:z_zhizuobiao

版权所有 职坐标-一站式IT培训就业服务领导者 沪ICP备13042190号-4
上海海同信息科技有限公司 Copyright ©2015 www.zhizuobiao.com,All Rights Reserved.
 沪公网安备 31011502005948号    

©2015 www.zhizuobiao.com All Rights Reserved

208小时内训课程