无法将内容方案uri转换为文件路径

时间:2017-03-30 08:10:01

标签: android file

我将.jpg.pdf.docx.xlx.mp3.mp4类型的罚款放在SD卡的同一位置(外部存储卡)

当我尝试选择文件时,我只能选择.jpg,。pdf文件,而不选择其他类型的文件

选择文件: - >

 1.path : `/storage/emulated/0/123.pdf`  (from this path i successfully attached file)
 2. path : `/storage/emulated/0/Program.docx`                        
 3. path : `/storage/emulated/0/ApiCalling.mp4`

错误是:

  

文件不存在..当我得到2.和3.路径数

代码是:

 public static void showFileChooser(Context context) {
    PICK_IMAGE_REQUEST = 2;
    Intent intent = new Intent(Intent.ACTION_GET_CONTENT);
    intent.setType("*/*");
    intent.addCategory(Intent.CATEGORY_OPENABLE);

    try {
        ((Activity) context).startActivityForResult(
                Intent.createChooser(intent, context.getResources().getString(R.string.select_file_msg)),
                PICK_IMAGE_REQUEST);
    } catch (android.content.ActivityNotFoundException ex) {
       e.print();
    }
}
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
Uri uri = data.getData();
         try {
                String path = Utility.getRealPathFromURI(this, uri);
                Log.e("path -> ",path);
                File f = new File(path);
                if (f.exists()) {
                }
                else
                {
                    Log.e("err -> ","file not exists");
                }
            }
    }
public static String getRealPathFromURI(Context context, Uri uri) throws URISyntaxException {
    String selection = null;
    String[] selectionArgs = null;
    // Uri is different in versions after KITKAT (Android 4.4), we need to
    if (uri != null) {
        if (Build.VERSION.SDK_INT >= 19 && DocumentsContract.isDocumentUri(context.getApplicationContext(), uri)) {
            if (isExternalStorageDocument(uri)) {
                final String docId = DocumentsContract.getDocumentId(uri);
                final String[] split = docId.split(":");
                return Environment.getExternalStorageDirectory() + "/" + split[1];
            } else if (isDownloadsDocument(uri)) {
                final String id = DocumentsContract.getDocumentId(uri);
                uri = ContentUris.withAppendedId(
                        Uri.parse("content://downloads/public_downloads"), Long.valueOf(id));
            } else if (isMediaDocument(uri)) {
                final String docId = DocumentsContract.getDocumentId(uri);
                final String[] split = docId.split(":");
                final String type = split[0];
                if ("image".equals(type)) {
                    uri = MediaStore.Images.Media.EXTERNAL_CONTENT_URI;
                } else if ("video".equals(type)) {
                    uri = MediaStore.Video.Media.EXTERNAL_CONTENT_URI;
                } else if ("audio".equals(type)) {
                    uri = MediaStore.Audio.Media.EXTERNAL_CONTENT_URI;
                }
                selection = "_id=?";
                selectionArgs = new String[]{
                        split[1]
                };
            }
        }

        if ("content".equalsIgnoreCase(uri.getScheme())) {
            String[] projection = {
                    MediaStore.Images.Media.DATA
            };
            Cursor cursor = null;
            try {
                cursor = context.getContentResolver()
                        .query(uri, projection, selection, selectionArgs, null);
                int column_index = cursor.getColumnIndexOrThrow(MediaStore.Images.Media.DATA);
                if (cursor.moveToFirst()) {
                    return cursor.getString(column_index);
                }
            } catch (Exception e) {
            }
        } else if ("file".equalsIgnoreCase(uri.getScheme())) {
            return uri.getPath();
        }
    }

    return null;
}

public static boolean isExternalStorageDocument(Uri uri) {
    return "com.android.externalstorage.documents".equals(uri.getAuthority());
}

public static boolean isDownloadsDocument(Uri uri) {
    return "com.android.providers.downloads.documents".equals(uri.getAuthority());
}

public static boolean isMediaDocument(Uri uri) {
    return "com.android.providers.media.documents".equals(uri.getAuthority());
}

2 个答案:

答案 0 :(得分:0)

试试这个

Intent mediaIntent = new Intent(Intent.ACTION_GET_CONTENT);
mediaIntent.setType("*/*"); //set mime type as per requirement
startActivityForResult(mediaIntent,REQUESTCODE_PICK_FILE);

然后你可以在onActivityResult

中找到路径
@Override
public void onActivityResult(int requestCode, int resultCode, Intent data) {
    // TODO Auto-generated method stub
    super.onActivityResult(requestCode, resultCode, data);
    if (requestCode == REQUESTCODE_PICK_FILE
            && resultCode == Activity.RESULT_OK) {
        Uri videoUri = data.getData();
        Log.d("", "Video URI= " + videoUri);


    }
}

答案 1 :(得分:0)

无法保证用户选择的内容位于外部存储上和/或由文件支持。即使它是,你很可能无法访问它。但是你可以简单地使用ContentResolver.openInputStream()和结果Intent的数据字段中的Uri来读取数据。