Внутренние файлы недоступны на Android - File.exists () возвращает false для любого файла.

Я пытаюсь получить доступ к файлу Geopackage размером 2,45 ГБ, который хранится во внутренней памяти, но всякий раз, когда я пытаюсь получить к нему доступ, я получаю сообщение об ошибке «Файл не существует».

Файл gpkg загружается через DownloadManager во внешнее хранилище перед копированием во внутреннее хранилище, но когда я вызываю new File(getContext().getFilesDir(), "roads.gpkg").exists();, мне возвращается false. Как и это, когда я бегу

File[] files = getContext().getFilesDir().listFiles();
for(File file : files){
    Log.i("FILE", file.getAbsolutePath());
}

файл не отображается.

Чтобы убедиться, что это не было неожиданным поведением со стороны DownloadManager или моего метода копирования, я вручную скопировал файл в «Android / data / uk.co.alexks.greenroutes / files», а также 11-байтовый текстовый файл, тест .txt 'на моем ноутбуке с Windows. Опять же, ни один из этих файлов не возвращает true для File.exists() и не отображается в приведенном выше выводе кода listFiles () (см. Ниже).

Вот полный код, когда я пытаюсь получить доступ к файлу:

File geopackage = new File(getContext().getFilesDir(), "roads.gpkg");
Log.i("GEOPACKAGE", String.format("GPKG File: %s", geopackage.getPath()));
Log.i("GEOPACKAGE", String.format("Exists? %s", geopackage.exists()?"T":"F"));

Log.i("FILE", getContext().getFilesDir().getPath());
File[] files = getContext().getFilesDir().listFiles();
for(File file : files){
   Log.i("FILE", file.getAbsolutePath());
}

//Pass geopackage to a new object that uses the Geopackage-Android library to handle it.

Вот результат Logcat:

I/GEOPACKAGE: GPKG File: /data/user/0/uk.co.alexks.greenroutes/files/roads.gpkg
I/GEOPACKAGE: Exists? F
I/FILE: /data/user/0/uk.co.alexks.greenroutes/files
    /data/user/0/uk.co.alexks.greenroutes/files/DATA_disk_creation_time_its
    /data/user/0/uk.co.alexks.greenroutes/files/DATA_disk_creation_time_vts_labl_uk.co.alexks.greenroutes_default
    /data/user/0/uk.co.alexks.greenroutes/files/DATA_disk_creation_time_vts_no_pois_uk.co.alexks.greenroutes_default
    /data/user/0/uk.co.alexks.greenroutes/files/DATA_disk_creation_time_vts_uk.co.alexks.greenroutes_default
    /data/user/0/uk.co.alexks.greenroutes/files/DATA_disk_creation_time_vts_inaka_uk.co.alexks.greenroutes_default
    /data/user/0/uk.co.alexks.greenroutes/files/DATA_disk_creation_time_its_ter
    /data/user/0/uk.co.alexks.greenroutes/files/com.google.android.gms.maps._m_u
    /data/user/0/uk.co.alexks.greenroutes/files/_m_t
I/FILE: /data/user/0/uk.co.alexks.greenroutes/files/DATA_ServerControlledParametersManager.data.uk.co.alexks.greenroutes
    /data/user/0/uk.co.alexks.greenroutes/files/ZoomTables.data

И ожидаемый результат:

I/GEOPACKAGE: GPKG File: /data/user/0/uk.co.alexks.greenroutes/files/roads.gpkg
I/GEOPACKAGE: Exists? T
I/FILE: /data/user/0/uk.co.alexks.greenroutes/files
    /data/user/0/uk.co.alexks.greenroutes/files/roads.gpkg
    /data/user/0/uk.co.alexks.greenroutes/files/test.txt

И мой манифест Android с разрешениями:

    <uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
    <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />

Как бы то ни было, я знаю, что должен использовать File.isFile (), чтобы проверить, действителен ли файл, но здесь это не поможет.

Любая помощь будет принята с благодарностью! :)


person Alex Shaw    schedule 26.04.2020    source источник
comment
Файл gpkg загружается через DownloadManager во внешнее хранилище перед копированием во внутреннее хранилище - ваш минимальный воспроизводимый пример делает не показывать это. Я вручную скопировал файл в Android / data / uk.co.alexks.greenroutes / files, а также 11-байтовый текстовый файл test.txt, используя свой ноутбук с Windows - они не входят в то, что Android SDK называется внутренним хранилищем. У вашего ноутбука есть доступ к внешнему хранилищу.   -  person CommonsWare    schedule 26.04.2020
comment
Спасибо, у меня создалось впечатление, что каталог был внутренним хранилищем, поэтому, когда я удалил приложение для проверки разрешений, я также удалил файл, но, поскольку я все еще мог видеть его во внешнем хранилище, я подумал, что мне не нужно повторно загружать Это.   -  person Alex Shaw    schedule 26.04.2020


Ответы (1)


Хорошо, оказалось, что файл действительно не существует во внутреннем хранилище (думаю, я удалил приложение, чтобы проверить запросы разрешений, но я увидел копию набора данных в "Android / data / package / files /" (внешнее хранилище) так думал, что он действительно существует), и, как @CommonWares указал в комментариях, папка Android / data / package / files, видимая из Windows, не является внутренним хранилищем, это внешнее хранилище, поэтому копирование файлов туда ничего не дало.

person Alex Shaw    schedule 26.04.2020