我只是找不到如何在 Android 11 上打开一个简单的 .csv 文件

I just can't find how to open a simple .csv file on Android 11

有了 Android 11 Scoped Storage 的新方法,它让我不得不学习它。我还在使用 Java,缺少 Android 11 的 Java 教程太疯狂了!

我正在制作一个可以打开 .csv 文件以读取其内容并将其添加到 arrayList 的应用程序,这样我就可以在 textview 上显示它,事情是,即使我正在阅读 Android 文档和所有内容,也没有任何效果!这是我到目前为止所做的:

按照 developer.android 上的教程进行操作:https://developer.android.com/training/data-storage/shared/documents-files

private void openFile() {
        Intent intent = new Intent(Intent.ACTION_OPEN_DOCUMENT);
        intent.addCategory(Intent.CATEGORY_OPENABLE);
        intent.setType("*/*");

        intent.putExtra(DocumentsContract.EXTRA_INITIAL_URI, true);

        startActivityForResult(intent, PICKFILE_REQUEST_CODE);
    }

这样我可以打开 filepicker 并导航到我的文件,然后阅读 .csv 我正在使用 ReaderCSV:

if (requestCode == PICKFILE_REQUEST_CODE
                && resultCode == Activity.RESULT_OK) {
            Uri uri = null;
            if (data != null) {
                uri = data.getData();

                try {
                    CSVReader reader = new CSVReader(new FileReader(uri.toString()));
                    String[] nextLine;
                    while ((nextLine = reader.readNext()) != null) {
                        System.out.println(nextLine[0] + nextLine[1] + "etc...");
                    }
                } catch (IOException | CsvValidationException e) {

                    Toast.makeText(this, e.toString(), Toast.LENGTH_SHORT).show();
                }

                //Toast.makeText(this, uri.toString(), Toast.LENGTH_SHORT).show();
            }
        }

但是当我尝试使用 uri 结果时,它给我一个错误:

"java.io.FileNotFoundException: content:/com.android.providers.media.documents/document/document%3A4165: open failed: ENOENT (No such file or directory)"

现在我被困住了,因为我无法以任何形式解决它。

在我的清单上我有权限:

<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
    <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"
        android:maxSdkVersion="28" />
    <uses-permission android:name="android.permission.MANAGE_EXTERNAL_STORAGE" />

编辑:这就是我解决特定问题的方法。

if (requestCode == 1
                && resultCode == Activity.RESULT_OK) {
            Uri uri = null;
            if (data != null) {
                uri = data.getData();

                try {

                    myList.clear();

                    InputStream inputStream = getContentResolver().openInputStream(uri);
                    BufferedReader r = new BufferedReader(new InputStreamReader(inputStream));
                    String mLine;
                    while ((mLine = r.readLine()) != null) {
                        myList.add(mLine);
                    }
                } catch (FileNotFoundException e) {
                    e.printStackTrace();
                } catch (IOException e) {
                    e.printStackTrace();
                }

                reload_myList();
            }
        }

这是有效的,但有一个问题,因为我的 .CSV 文件只是一列数据,它确实有效,因为 readLine(),如果你使用的是一个完全不同的 .CSV 文件,其中有许多数据分开on (,) 不要像我那样使用这个方法,因为我认为它不会像你想要的那样表现,我很确定你应该在读取文件时添加一些正则表达式(“,”),但我不'我不知道怎么做,我很高兴它成功了!

基本上我必须做的来获取文件的内容是使用:

InputStream inputStream = getContentResolver().openInputStream(uri);

BufferedReader r = new BufferedReader(new InputStreamReader(inputStream));

我认为问题出在这一行:

CSVReader reader = new CSVReader(new FileReader(uri.toString()));

当您使用 Uri 时,您实际上并没有保存文件的真实路径。所以你不能从 uri.toString().

创建 File 对象

我的建议:

  • 尝试使用不同的 CSVReader 构造函数。您可以从 Android 的 Uri 打开 InputStream 并读取该流。