Файл исключений Android FileInputStream не найден - PullRequest
0 голосов
/ 25 ноября 2018

Я пытаюсь распаковать tar с jtar и получаю

java.io.FileNotFoundException: Download / Data.tar (Нет такого файла или каталога)

Я не использую эмулятор, он прямо на моем телефоне.

Файл существует в папке загрузок моего андроида (даже до запуска приложения).

У меня есть все разрешения на чтение / запись.

File tarFile = new File(Environment.DIRECTORY_DOWNLOADS, "Data.tar");
        File destFolder = new File(Environment.DIRECTORY_DOCUMENTS + "/My Data/");
        if(!destFolder.exists())
        {
            // Make it, if it doesn't exit
            destFolder.mkdirs();
        }else{
            //TODO
            //delete the folder contents
        }


        // Create a TarInputStream
        try {
            TarInputStream tis = new TarInputStream(new BufferedInputStream(new FileInputStream(tarFile)));
            TarEntry entry;

            while ((entry = tis.getNextEntry()) != null) {
                int count;
                byte data[] = new byte[2048];
                FileOutputStream fos = new FileOutputStream(destFolder + "/" + entry.getName());
                BufferedOutputStream dest = new BufferedOutputStream(fos);

                while ((count = tis.read(data)) != -1) {
                    dest.write(data, 0, count);
                }

                dest.flush();
                dest.close();
            }

            tis.close();
        }catch (Exception e){
            Toast toast2 = Toast.makeText(getApplicationContext(), e.toString(), Toast.LENGTH_LONG);
            toast2.show();
            Log.e("TAG", "error", e);
        }

Logcat говорит, что ошибка находится в первой строке после попытки

РЕДАКТИРОВАТЬ: для некоторыхпричина, по которой он даже не создает папку / My Data /, даже если во время отладки он переходит в destFolder.mkdirs();.не знаю, как это связанои читабельный.

Есть ли какая-либо опасность, оставляющая его таким?будет ли на некоторых телефонах другой ...emullated/X/... номер?

Ответы [ 2 ]

0 голосов
/ 25 ноября 2018

Я решил это!

File tarFile = new File(Environment.DIRECTORY_DOWNLOADS, "Data.tar");

попытается получить относительный путь из вашего приложения, даже если вы напишите tarFile.getAbsolutePath().

Решение?File(Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_DOWNLOADS), "Data.tar");

0 голосов
/ 25 ноября 2018

Если версия Android для вашего устройства больше 6.0, недостаточно только объявить запрос разрешений в AndroidManifest xml.Вы также должны явно запрашивать перед любыми операциями, требующими разрешения.

if (ContextCompat.checkSelfPermission(thisActivity, Manifest.permission.WRITE_EXTERNAL_STORAGE) != PackageManager.PERMISSION_GRANTED) {
    // Permission is not granted
    if (ActivityCompat.shouldShowRequestPermissionRationale(thisActivity,
            Manifest.permission.WRITE_EXTERNAL_STORAGE)) {
        // Show an explanation to the user *asynchronously* -- don't block
        // this thread waiting for the user's response! After the user
        // sees the explanation, try again to request the permission.
    } else {
        // No explanation needed; request the permission
        ActivityCompat.requestPermissions(thisActivity,
            new String[] {
                Manifest.permission.WRITE_EXTERNAL_STORAGE
            },
            MY_PERMISSIONS_WRITE_EXTERNAL_STORAGE);
    }
}
...