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

Posted

技术标签:

【中文标题】我只是找不到如何在 Android 11 上打开一个简单的 .csv 文件【英文标题】:I just can't find how to open a simple .csv file on Android 11 【发布时间】:2021-12-31 04:58:21 【问题描述】:

借助 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: 内容:/com.android.providers.media.documents/document/document%3A4165: 打开失败:ENOENT(没有这样的文件或目录)”

现在我被困住了,因为无论如何我都无法解决它,无论是形状还是形式。

在我的清单上我有权限:

<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 文件只是一列数据,如果您使用的是完全不同的 .CSV 文件,其中许多数据分隔在 ( ,) 不要像我一样使用这种方法,因为我认为它的行为不会像你想要的那样,我很确定你应该在读取文件时添加某种 regex(","),但我不知道我很高兴它成功了!

基本上我必须做的是使用:

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

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

【问题讨论】:

【参考方案1】:

我认为问题出在这一行:

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

当您使用 Uri 时,您实际上并不持有文件的真实路径。所以你不能从 uri.toString() 创建 File 对象。

我的建议:

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

【讨论】:

我知道我错过了什么!是的,再看了一圈,我发现很多人都有这个问题,原来我需要使用 InputStream、getContentResolver 和 BufferedReader,现在我可以读取 .csv 文件了。

以上是关于我只是找不到如何在 Android 11 上打开一个简单的 .csv 文件的主要内容,如果未能解决你的问题,请参考以下文章

如何清除状态栏上的推送通知警报 - android

android11如何查看任务栈,找不到Running activities关键字

在 Android Studio 中找不到“填充父级”[重复]

android.content.ActivityNotFoundException:在 android 11 上打开 pdf 时找不到处理 Intent 的活动

Android openCV 示例错误:找不到 -lopencv_java

如何在 Android 选项卡之间进行通信