Android   发布时间:2022-04-28  发布网站:大佬教程  code.js-code.com
大佬教程收集整理的这篇文章主要介绍了android – 从sdcard marshmallow中的文件URI获取真实路径大佬教程大佬觉得挺不错的,现在分享给大家,也给大家做个参考。
我想选择存在于SD卡中的文件而不是内部存储器并上传它的服务器,但是我无法获得其获取其大小的路径.我已经开始使用以下代码选择文件的意图:
intent = new Intent(Intent.ACTION_OPEN_DOCUMENT);
 intent.addCategory(Intent.CATEGORY_OPENABLE);
 intent.setType("*/*");
 String[] mimetypes = {"application/*"};
 intent.putExtra(Intent.EXTRA_MIME_TYPES,mimetypes);
 startActivityForResult(
      Intent.createChooser(intent,"SELEct a File to Upload"),FILE_SELECT_CODE);

为了获取文件的路径,我使用this answer并且它正在工作,除非用户从sdcard(可移动)中选择任何文件.当我调试代码并发现该类型不是主要类型时,它不会进入这种情况:

if("priMary".equalsIgnoreCase(typE)){
     return Environment.getExternalStorageDirectory() + "/" + split[1];
}

所以我的问题是它还有什么呢?即如果类型不是主要的?在这种情况下我们如何获得文件路径?我已经搜索了许多问题和教程,其中任何一个都没有.我还尝试了其他部分this answer,但它不起作用,因为System.getenv()为“SECONDARY_STORAGE”返回null,为“EXTERNAL_STORAGE”返回sdcard.我尝试时遇到文件未找到异常:

if ("priMary".equalsIgnoreCase(typE)) {
    return Environment.getExternalStorageDirectory() + "/" + split[1];
}else{
    return System.getenv("EXTERNAL_STORAGE") + "/" + split[1];
}

文件的Uri和doc Id看起来像:

任何帮助?

解决方法

花了一些时间在Android设备管理器上后我找到了解决方案,这里是:

如果doc type id不是priMary,那么我使用以下命令创建路径:

filePath = "/storage/" + type + "/" + split[1];

编辑:如果是DocumentUri,请根据文件类型选择contentUri

这是完整的功能

public static String getRealPathFromURI_API19(Context context,Uri uri) {
    String filePath = "";

    // 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];
        } else {

            if (Build.VERSION.SDK_INT > 20) {
                    //getExternalMediaDirs() added in API 21
                    File extenal[] = context.getExternalMediaDirs();
                    if (extenal.length > 1) {
                        filePath = extenal[1].getAbsolutePath();
                        filePath = filePath.subString(0,filePath.indexOf("Android")) + split[1];
                    }
             }else{
                    filePath = "/storage/" + type + "/" + split[1];
             }
            return filePath;
        }

    } 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));

        cursor cursor = null;
        final String column = "_data";
        final String[] projection = {column};

        try {
            cursor = context.getContentResolver().query(uri,projection,null,null);
            if (cursor != null && cursor.moveToFirst()) {
                final int index = cursor.getcolumnIndexOrThrow(column);
                String result = cursor.getString(indeX);
                cursor.close();
                return result;
            }
        } finally {
            if (cursor != null)
                cursor.close();
        }
    } else if (DocumentsContract.isDocumentUri(context,uri)) {
        // MediaProvider
        String wholEID = DocumentsContract.getDocumentId(uri);

        // Split at colon,use second item in the array
        String[] ids = wholEID.split(":");
        String id;
        String type;
        if (ids.length > 1) {
            id = ids[1];
            type = ids[0];
        } else {
            id = ids[0];
            type = ids[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[]{iD};
        final String column = "_data";
        final String[] projection = {column};
        cursor cursor = context.getContentResolver().query(contentUri,SELEction,SELEctionArgs,null);

        if (cursor != null) {
            int columnIndex = cursor.getcolumnIndex(column);

            if (cursor.moveToFirst()) {
                filePath = cursor.getString(columnIndeX);
            }
            cursor.close();
        }
        return filePath;
    } else {
        String[] proj = {MediaStore.Audio.Media.DATA};
        cursor cursor = context.getContentResolver().query(uri,proj,null);
        if (cursor != null) {
            int column_index = cursor.getcolumnIndexOrThrow(MediaStore.Audio.Media.DATA);
            if (cursor.moveToFirst())
                filePath = cursor.getString(column_indeX);
            cursor.close();
        }


        return filePath;
    }
    return null;
}

大佬总结

以上是大佬教程为你收集整理的android – 从sdcard marshmallow中的文件URI获取真实路径全部内容,希望文章能够帮你解决android – 从sdcard marshmallow中的文件URI获取真实路径所遇到的程序开发问题。

如果觉得大佬教程网站内容还不错,欢迎将大佬教程推荐给程序员好友。

本图文内容来源于网友网络收集整理提供,作为学习参考使用,版权属于原作者。
如您有任何意见或建议可联系处理。小编QQ:384754419,请注明来意。