当我们选择图片以后,返回的是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());    }}


更多相关文章

  1. Android提高之多方向抽屉实现方法
  2. Android(安卓)UI源码解析
  3. Android之MVVM架构指南(二):DataBinding
  4. Android中TextView显示插入的图片实现方法
  5. Android实现BMP和PNG转换为JPEG格式
  6. Android(安卓)Studio中AIDL使用方法
  7. Android客户端通过GET和POST向服务器发送数据
  8. Android(安卓)RxJava创建操作符Timer的方法
  9. 在Android(安卓)5.0中使用JobScheduler

随机推荐

  1. Android(安卓)Studio中的typo波浪线提示
  2. android 8.0 报错StartForeground Bad No
  3. Android(安卓)Txt文本读写类源代码
  4. Android(安卓)设备管理器 理解和使用
  5. Android(安卓)自定义标签 Imagebutton实
  6. 页面js判断浏览器类型
  7. Linux Android(安卓)studio配置任意目录
  8. android API Window类
  9. Android(安卓)7.1新特性——长按出现快捷
  10. 据说是程序员才看懂的段子。。。