【发布时间】:2018-09-05 00:46:25
【问题描述】:
我正在创建一个应用程序,我需要用户能够将数据导入设备上的本地 Room 数据库。我正在使用startActivityForResult(...) 方法从此处显示的Intent.ACTION_GET_CONTENT 获得响应:
Intent intent = new Intent().setType("*/*").setAction(Intent.ACTION_GET_CONTENT);
startActivityForResult(Intent.createChooser(intent, "Select File"), GET_FILE_INTENT_CODE);
在要求用户指定要导入的文件的布局并将其转换为ImportStrategy 后,我将onActivityResult(...) 中收到的strategy 和Uri 都传递给我的importData方法
void importData(Uri data, ImportStrategy strategy) {
try {
File csvFile = new File(Environment.getExternalStorageDirectory() + data.getPath());
CSVReader reader = new CSVReader(new FileReader(csvFile.getAbsolutePath()));
String[] nextLine;
List<RainfallRecord> records = new ArrayList<>();
while ((nextLine = reader.readNext()) != null) {
records.add(getRecord(nextLine, strategy));
}
db.recordDao().insertAll(records);
} catch (FileNotFoundException e) {
e.printStackTrace();
Toast.makeText(this.getApplicationContext(), "Error loading file", Toast.LENGTH_LONG).show();
} catch (IOException ex) {
ex.printStackTrace();
Toast.makeText(this.getApplicationContext(), "Error processing file", Toast.LENGTH_LONG).show();
}
}
我遇到的问题是当它到达创建 CSVReader 的行时,我得到一个 FileNotFoundException
堆栈跟踪:
W/System.err: java.io.FileNotFoundException: /storage/emulated/0/document/1945 (No such file or directory)
W/System.err: at java.io.FileInputStream.open0(Native Method)
W/System.err: at java.io.FileInputStream.open(FileInputStream.java:231)
W/System.err: at java.io.FileInputStream.<init>(FileInputStream.java:165)
W/System.err: at java.io.FileInputStream.<init>(FileInputStream.java:112)
W/System.err: at java.io.FileReader.<init>(FileReader.java:58)
W/System.err: at ekshore.net.raintracker.MainActivity.importData(MainActivity.java:351)
W/System.err: at ekshore.net.raintracker.MainActivity.lambda$customStrategy$11(MainActivity.java:406)
W/System.err: at ekshore.net.raintracker.-$$Lambda$MainActivity$A7AYI1UOo4MNVQeFvopgj2wHPMM.onClick(Unknown Source:11)
W/System.err: at android.view.View.performClick(View.java:6597)
W/System.err: at android.view.View.performClickInternal(View.java:6574)
W/System.err: at android.view.View.access$3100(View.java:778)
W/System.err: at android.view.View$PerformClick.run(View.java:25885)
W/System.err: at android.os.Handler.handleCallback(Handler.java:873)
W/System.err: at android.os.Handler.dispatchMessage(Handler.java:99)
W/System.err: at android.os.Looper.loop(Looper.java:193)
W/System.err: at android.app.ActivityThread.main(ActivityThread.java:6669)
W/System.err: at java.lang.reflect.Method.invoke(Native Method)
W/System.err: at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:493)
W/System.err: at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:858)
返回的 URI 是 content://com.android.providers.downloads.documents/document/1945 最后的 1945 应该是 Rain(2018).xlsx
在我对这个问题所做的所有研究中,我发现从 content 的 URI 类型加载文件存在问题。但是我看到的所有修复都是针对媒体文件(图像或音频),而不是像这样的面向数据的文件。当我试图模仿使用ContentResolver 的其他解决方案时,我无法弄清楚。
如果有人能帮我解决这个问题,我将不胜感激。
【问题讨论】:
标签: java android csv android-studio