if (data.getData() != null) {
if (data.getData().getScheme().equals("content")) {
String s = data.getData().getPath(); //文件路径
Uri uri = data.getData(); // uri
File file = new File(s); //可打开的文件路径
Z.log("path: "+s);
Z.log("uri: "+uri);
Z.log("file: "+file);
Z.show("获取了返回值");
Z.log(file.exists()+"");
if (file.exists()) { //判断文件是否存在
Log.e("file", "f是文件且存在");
Conversation conversation = getCurrentConversation();
sendFile(conversation.getConversationType(), conversation.getTargetId(), file, uri);
} else {
Z.log("文件不存在");
}
}else {
Z.show("如果文件类型不同");
}
没毛病吧?结果是打印的path是 /document/image:4935 ,为啥是这样啊,但奇怪的事来了:我使用下载的第三方re管理器打开选择文件,却可以正常打印/storage/emulated/0/Download/1452843394654564.jpg,,,,,什么情况?
使用这句了..虽然有点长
/**
android 4.4以上和以下版本使用自带文件管理器打开本地文件路径不同,的解决方法
*@param context
@param uri
-
@return
*/@TargetApi(Build.VERSION_CODES.KITKAT) //版本
-
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.
*/
-
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.
*/
-
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.
*/
-
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.
*/
-
static boolean isMediaDocument(Uri uri) {
return "com.android.providers.media.documents".equals(uri.getAuthority()); }
其实就一句话,不同手机拿到路径不同,需要将拿到的路径转换成绝对路径
并不是错误,而是你拿到的还只是文件的scheme路径,是uri地址,还不是真正的file路径,需要把uri转换成file,比如你现在取的是图片文件,可以这么转换
public String getRealPathFromURI(Uri uri) {
String res = null;
String[] proj = { MediaStore.Images.Media.DATA };
Cursor cursor = getContentResolver().query(uri, proj, null, null, null);
if(cursor.moveToFirst()){;
int column_index = cursor.getColumnIndexOrThrow(MediaStore.Images.Media.DATA);
res = cursor.getString(column_index);
}
cursor.close();
return res;
}