Android: чтение из текстового файла - завершено с ошибкой открытия исключения: ENOENT (Нет такого файла или каталога) - PullRequest
0 голосов
/ 01 августа 2020

Я новичок в разработке приложений Android (java), и мне нужна помощь. Мне нужно прочитать текстовый файл и сохранить каждую строку в List . Я прочитал много обсуждений здесь, в stackoverflow. Один из них вдохновил мой код. Но я не могу решить свою проблему ...

Поэтому я вызываю средство выбора файлов, как показано ниже:

    Intent intent = new Intent(Intent.ACTION_GET_CONTENT);
intent.setType("*/*");
intent.addCategory(Intent.CATEGORY_OPENABLE);

try {                                
    startActivityForResult(Intent.createChooser(intent, getString(R.string.vyber_soubor)), VYBER_SOUBORU_POZNAMKA);
} catch (android.content.ActivityNotFoundException ex) {
    Toast.makeText(kontext, "SeznamPoznamek::onCreate::tlPridej.setOnClickListener - Please install a File Manager.", Toast.LENGTH_LONG).show();
}

и в функции onActivityResult (ниже показана только необходимая часть, остальная функция помечены точками) выбрать из намерения выбранного файла. С помощью функции getPath извлеките путь к файлу uri в виде строки. Эту строку пути к файлу я отправляю в функцию importujTextovouPoznamku, где я хочу читать строки из текстового файла. Но в строке «FileInputStream fis = new FileInputStream (mujExterniSoubor);» является исключением ("java .io.FileNotFoundException: /document/primary:DCIM/veci_svor.txt: ошибка открытия: ENOENT (Нет такого файла или каталога)") выбросил

В манифесте:

и приложение имеет разрешение на запись в хранилище.

Я удивлен, что у меня есть двойная точка в пути к файлу (вы можете увидеть мою строку пути к файлу в исключении, также видно, что мой файл хранится в папке DCIM)

И второй сюрприз для меня - это то, что на реальном телефоне Huawei honor 6A (android 6) этот код работает (но только на этом телефоне), а на другом телефоне Motorola e5 - нет. plus (android 8) или виртуальных машин (android 6 или 8).

Кто-нибудь может мне помочь или посоветовать, что я должен попытаться продолжить в моем коде без исключения Спасибо fik236

некоторая часть кода:

    private String getPath(Uri uri) {
        String path = null;
        String[] projection = { MediaStore.Files.FileColumns.DATA };
        Cursor cursor = getContentResolver().query(uri, projection, null, null, null);

        if(cursor == null){
            path = uri.getPath();
        }
        else{
            cursor.moveToFirst();
            int column_index = cursor.getColumnIndexOrThrow(projection[0]);
            path = cursor.getString(column_index);
            cursor.close();
        }

        return ((path == null || path.isEmpty()) ? (uri.getPath()) : path);
    }

public void onActivityResult(int kodVolani, int vysledekVolani, Intent mujVraceciIntent) {
        super.onActivityResult(kodVolani, vysledekVolani, mujVraceciIntent);
    .
    .
    .
    } else if ( kodVolani== VYBER_SOUBORU_POZNAMKA) {
            Uri uri = mujVraceciIntent.getData();
            String src = getPath(uri);
            importujTextovouPoznamku(src);
    }
    .
    .
    .


public void importujTextovouPoznamku (String jmenoSouboru) {
    List<String> precteneRadky = new ArrayList<>();

        File mujExterniSoubor = new File(jmenoSouboru);
        try {
            FileInputStream fis = new FileInputStream(mujExterniSoubor); //problem
            DataInputStream in = new DataInputStream(fis);
            BufferedReader br = new BufferedReader(new InputStreamReader(in));

            String radek;
            while ((radek = br.readLine()) != null) {
                precteneRadky.add(radek);
            }
            br.close();
            in.close();
            fis.close();
        } catch (IOException e) {
            e.printStackTrace();
            Toast.makeText(getBaseContext(),"SeznamPoznamek.java::prectiRadkyZeSouboru:" + e.getMessage(), Toast.LENGTH_LONG).show();
        }
    .
    .
    .

1 Ответ

0 голосов
/ 01 августа 2020

Не пытайтесь получить путь из uri с намерением открыть входной файловый поток для этого пути. Лучше открыть поток ввода для uri напрямую.

InputStream is = getContentResolver().openInputStream(data.getData());

Затем чтение будет таким же, как и у вашего fis.

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