我只是找不到如何在 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 文件的主要内容,如果未能解决你的问题,请参考以下文章
android11如何查看任务栈,找不到Running activities关键字
在 Android Studio 中找不到“填充父级”[重复]
android.content.ActivityNotFoundException:在 android 11 上打开 pdf 时找不到处理 Intent 的活动