如何返回可用的文件路径?

时间:2012-07-02 14:44:01

标签: java android

我有一项活动,当用户在文件上按“共享”时,它会打开我的应用并开始上传文件。现在这与图像完美配合,因为返回的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它将用于任何类型的文件?

2 个答案:

答案 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();
        }
}