• Android 4.4 根据uri获取路径的方法


    当我们选择图片以后,返回的是Uri,此时我们要把路径存储到数据库,必须将其转换成String类型。

    URI:  //content://com.android.providers.media.documents/document/image%3A255779

    转换后的路径:/storage/emulated/0/DCIM/Camera/IMG_20160117_132926.jpg

    转换的方法:getPath

    import android.annotation.SuppressLint;
    import android.content.ContentUris;
    import android.content.Context;
    import android.database.Cursor;
    import android.net.Uri;
    import android.os.Build;
    import android.os.Environment;
    import android.provider.DocumentsContract;
    import android.provider.MediaStore;
    
    public class GetPathFromUri4kitkat {
    
        /**
         * 专为Android4.4设计的从Uri获取文件绝对路径,以前的方法已不好使
         */
        @SuppressLint("NewApi")
        public static String getPath(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];
                    }
     
                    // TODO handle non-primary volumes
                }
                // 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;
        }
     
        /**
         * Get the value of the data column for this Uri. This is useful for
         * MediaStore Uris, and other file-based ContentProviders.
         * 
         * @param context
         *            The context.
         * @param uri
         *            The Uri to query.
         * @param selection
         *            (Optional) Filter used in the query.
         * @param selectionArgs
         *            (Optional) Selection arguments used in the query.
         * @return The value of the _data column, which is typically a file path.
         */
        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;
        }
     
        /**
         * @param uri
         *            The Uri to check.
         * @return Whether the Uri authority is ExternalStorageProvider.
         */
        public static boolean isExternalStorageDocument(Uri uri) {
            return "com.android.externalstorage.documents".equals(uri.getAuthority());
        }
     
        /**
         * @param uri
         *            The Uri to check.
         * @return Whether the Uri authority is DownloadsProvider.
         */
        public static boolean isDownloadsDocument(Uri uri) {
            return "com.android.providers.downloads.documents".equals(uri.getAuthority());
        }
     
        /**
         * @param uri
         *            The Uri to check.
         * @return Whether the Uri authority is MediaProvider.
         */
        public static boolean isMediaDocument(Uri uri) {
            return "com.android.providers.media.documents".equals(uri.getAuthority());
        }
    }

    参考:http://www.2cto.com/kf/201502/376975.html

    将路径转换成Bitmap,注意存储的时候可能多一个空格,此时路径找不到文件,需将空格替换

    /**
         * 从SD卡中得到图片
         * @param filepath
         * @return
         */
        public static Bitmap getBitmapFromSD(String filePath){
            try{
                filePath=filePath.replace(" ", "");
                File f=new File(filePath);
                if(f.exists()){
                    Bitmap bm=BitmapFactory.decodeFile(filePath);
                    return  bm; 
                }
                else{
                    return null;
                }
            }
            catch(Exception ex){
                LogUtil.WriteError(ex);
                return null;
            }
        }
  • 相关阅读:
    [原创]Java开发如何在线打开Word文件
    [原创]Java开发在线打开编辑保存Word文件(支持多浏览器)
    [原创]java操作word(一)
    [原创]java对word文档的在线打开
    修改ZEN CART系统遇到的问题总结(不断更新)
    MYSQL 5.1 插入空值BUG 解决方法
    zen cart 安装 商品批量管理插件(easy_populate_v1257_utf8)出现的问题
    C# 区分无线网卡和有线网卡的MAC
    C# Flash的背景透明处理
    c#Windows服务
  • 原文地址:https://www.cnblogs.com/huangzhen22/p/5160128.html
Copyright © 2020-2023  润新知