我正在设计一个应用程序,用户从内存中选择一个文本文件,应用程序会说出来。我正在使用Intents来做到这一点。
我的onActivityResult()
看起来像这样。
protected void onActivityResult(int reqCode, int resCode, Intent data){
if(resCode == Activity.RESULT_OK && data != null){
Uri u = data.getData();
String str = u.getPath();
Toast.makeText(this, "str", Toast.LENGTH_LONG).show();
//File file = new File(str);}}
所以最初,我正在使用我能够读取文件的路径。但是知道,它正在返回/external/file/6433
。无论我的文件有多深,它都会返回/external/file/number
。
请告诉我需要做些什么来获得实际路径,即/storage/emulated/0/
。
答案 0 :(得分:0)
您从intent获得的字符串实际上是该文件的URI。您可以使用此方法获取实际路径。我把这段代码放在我的Utils类中。代码很长。您可以在此处参考实际的Utils类:Utils.getPath
public static String getActualPath(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;
}
并对ActivityResult进行一些更改
Uri u = data.getData();
String filePath = Utils.getActualPath(this, u);
Toast.makeText(this, filePath, Toast.LENGTH_LONG).show();