Android: проблема с открытием выбранного пользователем файла CSV или EXCEL - PullRequest
0 голосов
/ 05 сентября 2018

Я создаю приложение, и мне нужно, чтобы пользователь мог импортировать данные в локальную базу данных 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, я не смог понять это.

Если бы кто-нибудь мог помочь мне и помочь мне разобраться в этом, я был бы очень признателен.

1 Ответ

0 голосов
/ 15 сентября 2018

После нескольких дополнительных исследований я наткнулся на этот блог и обнаружил, что пытался ошибиться. Мне нужно было открыть файл не через объект File, который требует путь к файлу. Вместо этого мне нужно было использовать ContentResolver для создания и InputStream и получать данные таким образом, код в итоге выглядел так:

try {
        ContentResolver contentResolver = this.getContentResolver();

        InputStream inputStream = contentResolver.openInputStream(data);
        Scanner scanner = new Scanner(inputStream).useDelimiter("\n");

        String nextLine = scanner.nextLine();
        List<RainfallRecord> records = new ArrayList<>();

        if (nextLine.matches("^[A-Za-z]"));
            nextLine = scanner.nextLine();

        while (scanner.hasNext()) {
            String[] rainData = nextLine.split(",");
            nextLine = scanner.nextLine();
            records.add(getRecord(rainData, strategy));
        }

        db.recordDao().insertAll(records);
    } catch (IOException ex) {
        ex.printStackTrace();
        Toast.makeText(this.getApplicationContext(), "Error processing file", Toast.LENGTH_LONG).show();
    }

if (nextLine.matches("^[A-Za-z]")); проверяет наличие заголовка и пропускает его, если он есть.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...