After spending time on Android Device Manager I have found solution, here it is:
If doc type id is not primary then I create path using :
filePath = "/storage/" + type + "/" + split[1];
EDIT1: in case of DocumentUri select contentUri on basis of file type
Here is complete function:
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(); for (File f : extenal) { filePath = f.getAbsolutePath(); if (filePath.contains(type)) { int endIndex = filePath.indexOf("Android"); filePath = filePath.substring(0, endIndex) + 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, 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, projection, 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, null, 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; }
EDIT2 For handling host like content://com.adobe.scan.android.documents/document/ check code here
my question is what will be it's else?. You mean 'type'? Well you can tell!