我有一项活动,当用户在文件上按“共享”时,它会打开我的应用并开始上传文件。现在这与图像完美配合,因为返回的URI是MediaStore。但我希望能够从任何来源返回URI,例如从ES文件资源管理器
以下是当前代码:
public String getPath(Uri uri) {
String[] projection = { MediaStore.Images.Media.DATA };
Cursor cursor = managedQuery(uri, projection, null, null, null);
int column_index = cursor
.getColumnIndexOrThrow(MediaStore.Images.Media.DATA);
cursor.moveToFirst();
return cursor.getString(column_index);
}
我怎样才能这样做而不是MediaStore它将用于任何类型的文件?
答案 0 :(得分:1)
我建议跳过路径步骤(如果可能的话)并直接获取一个可以简化一些事情的InputStream:
public InputStream getInputStream(Uri uri) {
InputStream stream = null;
String scheme = uri.getScheme();
try {
if (ContentResolver.SCHEME_CONTENT.equals(scheme) || ContentResolver.SCHEME_FILE.equals(scheme) || ContentResolver.SCHEME_ANDROID_RESOURCE.equals(scheme)) {
stream = getContentResolver().openInputStream(uri);
} else if ("https".equals(scheme) || "http".equals(scheme)) {
// ContentResolver can't handle web uris. Handle or skip them as you see fit.
}
} catch (FileNotFoundException e) {
// Handle the exception however you see fit.
}
return stream;
}
我赞成使用ContentResolver并让它理清细节...例如,如果你得到一个与MediaStore无关的内容uri会发生什么?通过让ContentResolver处理它,您不必关心。
答案 1 :(得分:0)
你做不到。您可以将它用于媒体商店,因为这些图像的路径存储在内置的SQLite数据库中,但是您的SD卡上的文件在数据库中没有条目。
您可以检查URI的方案是内容还是文件,并使用不同的方法以下列方式访问该文件:
public String getPath(Uri uri) {
if(uri.getScheme().equals("content")){
String[] projection = { MediaStore.Images.Media.DATA };
Cursor cursor = managedQuery(uri, projection, null, null, null);
int column_index = cursor.getColumnIndexOrThrow(
MediaStore.Images.Media.DATA);
cursor.moveToFirst();
return cursor.getString(column_index);
} else if(uri.getScheme().equals("file")){
File myFile = new File(uri);
return myFile.getAbsolutePath();
}
}