android中选择文件,部分手机找不到文件路径问题的解决
原文地址: http://write.blog.csdn.net/postedit
直接上代码,注释已经很清楚
/**
* Get a file path from a Uri. This will get the the path for Storage Access
* Framework Documents, as well as the _data field for the MediaStore and
* other file -based ContentProviders.
*
* @param context The context.
* @param uri The Uri to query.
* @author paulburke
*/
@SuppressLint( "NewApi")
public 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.
*/
public 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.
*/
public 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.
*/
public 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.
*/
public static boolean isMediaDocument(Uri uri) {
return "com.android.providers.media.documents" .equals(uri.getAuthority());
}
--------------
spring mvc+tomcat源码分析视频 (复制链接在浏览器打开)
https://study.163.com/course/courseMain.htm?share=2&shareId=480000001919582&courseId=1209399899&_trace_c_p_k2_=6d81bc445e9c462ab8d6345e40f6b0bf
更多相关文章
- Android Fresco图片处理库用法API英文原文文档3(Facebook开源Andr
- OpenGL ES教程I之创建OpenGL视图(原文对照)
- Android 的res/values/colors自定义颜色列表和注释表及布局文件
- Android 总结:打造Android中的流式布局和热门标签(源码有详细注释)
- IllegalStateException,PatternSyntaxException,Android studio 注
- OpenGL ES教程V之更多3D模型(原文对照)
- Android studio中新建类时自动生成注释的设置
- 【Android开发学习43】OpenGL ES教程VI之纹理贴图(原文对照)