使用选择器从外部存储器加载文件

时间:2015-10-06 23:15:00

标签: android file

所以,我试图像这样加载一个简单的.txt文件:

    private void showFileChooser() {
    Intent intent = new Intent(Intent.ACTION_GET_CONTENT);
    intent.setType("text/plain");
    intent.addCategory(Intent.CATEGORY_OPENABLE);

    try {
        startActivityForResult(
                Intent.createChooser(intent, "Select a File to Upload"),
                FILE_SELECT_CODE);
    } catch (android.content.ActivityNotFoundException ex) {
        Toast.makeText(this, "Please install a File Manager.",
                Toast.LENGTH_SHORT).show();
    }
}

当然,抓住这样的结果:

 protected void onActivityResult(int requestCode, int resultCode, Intent data) {
    switch (requestCode) {
        case FILE_SELECT_CODE:
            if (resultCode == RESULT_OK) {

                // Get the Uri of the selected file
                Uri uri = data.getData();

如果我使用我安装的文件浏览器(文件浏览器,请参见上图),它在genymotion和我的设备上效果很好,现在,如果直接使用选择器:

enter image description here

它说无法找到指定的文件。 (FileNotFoundException异常)

现在,我已经意识到我从这两个文件选择器获得的URI是不同的

  

内容://com.android.externalstorage.documents/document/primary%3ADownload%2Ffile.txt< - 这个没有工作(android内置于资源管理器中)

     

content:// media / external / file / 44751< - 这个工作(自定义资源管理器)

有没有人知道为什么我为SAME文件获取不同的URI。

修改 我尝试使用内容解析器从URI获取文件路径,如下所示:

public class Utils {

public static String getRealPathFromURI(Context context, Uri contentUri) {
    Cursor cursor = null;
    try {
        String[] proj = {MediaStore.Files.FileColumns.DATA};
        cursor = context.getContentResolver().query(contentUri, proj, null, null, null);
        int column_index = cursor.getColumnIndexOrThrow(proj[0]);
        cursor.moveToFirst();
        return cursor.getString(column_index);
    } finally {
        if (cursor != null) {
            cursor.close();
        }
    }
}

}

仍然没有运气:(

2 个答案:

答案 0 :(得分:1)

@ CommonsWare的asnwer必须是解决这个问题的正确方法,但我不确定如何实施他的解决方案。 我最终做了@Paul Burke在这个链接上的建议:

Android Gallery on KitKat returns different Uri for Intent.ACTION_GET_CONTENT

修改

就我的具体情况而言,这就是我的代码结束的方式。我把它留在这里以备将来参考。 (我正在使用@ CommonsWare的解释)看到他上面的答案。

               try {
                    InputStream inputStream = getContentResolver().openInputStream(uri);
                    BufferedReader br = null;
                    if (inputStream != null) {
                        br = new BufferedReader(new InputStreamReader(inputStream));

                        String line;
                        while ((line = br.readLine()) != null) {
                            text.append(line);
                            text.append("\n");
                        }
                    } else {
                        subscriber.onError(new InputException("There's something seriously wrong with this file"));
                    }

                } catch (IOException e) {
                    e.printStackTrace();
                    subscriber.onError(e);
                }

答案 1 :(得分:0)

  

我尝试使用内容解析器从URI中获取文件路径

没有文件路径。您可以在本地文件系统上访问的A Uri does not necessarily point to a file,就像此网页的URL不一定指向您可以在本地文件系统上访问的文件一样。 Uri可能:

  • 表示另一个应用程序的内部存储中保存的文件
  • 表示数据库中的BLOB列值
  • 表示在“云”中保存的文件,在请求时下载

使用ContentResolveropenInputStream()等方法来读取Uri所代表的内容,就像使用HttpUrlConnection读取由openInputStream()所代表的内容一样此网页的URL。 UriInputStream作为参数并返回InputStream。您可以像使用其他任何InputStream一样使用FileInputStream InputStream(例如,来自HttpUrlConnection的{​​{1}},BitmapFactory。其确切的机制将在很大程度上取决于基础数据(例如read in a string,传递给Bitmap以解码{{1}}。)