美文网首页
android自带文件选择器获取路径

android自带文件选择器获取路径

作者: 广陵墨玉刀 | 来源:发表于2018-12-28 17:51 被阅读0次

    String video_path=FileUtils.getInstance(this).getChooseFileResultPath(uri);

    public class FileUtils {

    private Contextcontext;

        private static FileUtilsutil =null;

        private FileUtils(Context context) {

    this.context = context;

        }

    public static FileUtilsgetInstance(Context context) {

    if (util ==null) {

    util =new FileUtils(context);

            }

    return util;

        }

    /**

        * 对外接口  获取uri对应的路径

        *

        * @param uri

        * @return

        */

        public StringgetChooseFileResultPath(Uri uri) {

    String chooseFilePath =null;

            if ("file".equalsIgnoreCase(uri.getScheme())) {//使用第三方应用打开

                chooseFilePath = uri.getPath();

                Toast.makeText(context, chooseFilePath, Toast.LENGTH_SHORT).show();

                return chooseFilePath;

            }

    if (Build.VERSION.SDK_INT > Build.VERSION_CODES.KITKAT) {//4.4以后

                chooseFilePath = getPath(context, uri);

            }else {//4.4以下下系统调用方法

                chooseFilePath = getRealPathFromURI(uri);

            }

    return chooseFilePath;

        }

    private StringgetRealPathFromURI(Uri contentUri) {

    String res =null;

            String[] proj = {MediaStore.Images.Media.DATA};

            Cursor cursor =context.getContentResolver().query(contentUri, proj, null, null, null);

            if (null != cursor && cursor.moveToFirst()) {

    int column_index = cursor.getColumnIndexOrThrow(MediaStore.Images.Media.DATA);

                res = cursor.getString(column_index);

                cursor.close();

            }

    return res;

        }

    /**

        * 专为Android4.4设计的从Uri获取文件绝对路径,以前的方法已不好使

        */

        @SuppressLint("NewApi")

    private StringgetPath(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())) {

    uri.getPath();

            }

    return null;

        }

    private StringgetDataColumn(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.

    */

        private 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.

    */

        private 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.

    */

        private boolean isMediaDocument(Uri uri) {

    return "com.android.providers.media.documents".equals(uri.getAuthority());

        }

    }

    相关文章

      网友评论

          本文标题:android自带文件选择器获取路径

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