0

我有一个活动,当用户在文件上按“共享”时,它会打开我的应用程序并开始上传文件。现在这与图像完美配合,因为返回的 URI 是针对 MediaStore 的。但我希望能够从任何来源(例如 ES 文件资源管理器)返回 URI

这是当前代码:

    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 它将用于任何类型的文件?

4

2 回答 2

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 处理它,您不必在意。

于 2012-07-02T15:27:44.530 回答
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();
        }
}
于 2012-07-02T15:01:38.163 回答