Я создаю приложение, и мне нужно, чтобы пользователь мог импортировать данные в локальную базу данных 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
, я передаю strategy
и Uri
, полученные в onActivityResult(...)
, моему 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
Во всех исследованиях, которые я проводил по этой проблеме, я видел, что существуют проблемы с загрузкой файлов из типов URI content
. Но все исправления, которые я видел, относились к медиафайлам (изображениям или аудио), а не к файлам, ориентированным на данные, как это. И когда я попытался имитировать другие решения, использующие ContentResolver
, я не смог понять это.
Если бы кто-нибудь мог помочь мне и помочь мне разобраться в этом, я был бы очень признателен.