【问题标题】:How to return workable filepath?如何返回可行的文件路径?
【发布时间】:2012-07-02 14:44:01
【问题描述】:

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

【问题讨论】:

    标签: java android


    【解决方案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 来处理,您不必在意。

    【讨论】:

    • 很有趣,我很快就会试试这个。谢谢
    【解决方案2】:

    你不能那样做。您可以将它用于媒体存储,因为这些图像的路径存储在内置的 SQLite 数据库中,但您的 sd 卡上的文件在数据库中没有条目。

    您可以检查URI的scheme是内容还是文件,并使用不同的方法访问文件,方式如下:

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

    【讨论】:

    • 谢谢,工作就像一个魅力,但做了一些小的修改。上面的代码没有让我编译,直到我去掉“if(uri.getScheme().equals(“file”)”并在 (uri.getScheme().equals(“content”) 后面加上一个额外的括号,我制作文件 myFile = new File(uri.getPath());
    • 哦,抱歉那些错别字,我更新了我的答案。感谢您指出。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-10-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多