Android lollipop пишет в SDCard из нативного кода C++
У меня есть приложение для Android, которое использует много родного кода на C++. Приложение должно работать с файлами, расположенными на SDCard (чтение, создание, добавление). Но Kitkat + запретил запись в SDCard для сторонних приложений. Android 5 представил новый API, который позволяет это снова.
Как использовать новый API доступа к SD-карте, представленный для Android 5.0 (Lollipop)?
Все примеры и документация, которые я нашел, в основном для Java. Примеры для нативного кода не существуют или очень неясны. Поэтому я хочу задать несколько вопросов.
Ссылка выше содержит ценный пример того, как получить DocumentFile, который может вернуть ParcelFileDescriptor. Из этого объекта я могу получить родной файловый дескриптор - ParcelFileDescriptor.getFd(). Это целое число, которое я посылаю в код C++ через jni.
В C++ я открываю файл с помощью fdopen(fd).
Мои вопросы:
- Является ли функция fdopen правильным способом, как открыть файл с новым API? Или DocumentFile уже открывает файл, и я должен использовать fd только в дальнейших операциях.
- Достаточно закрыть дескриптор файла внутри нативного кода с помощью fclose? или я должен закрыть его на стороне Java с ParcelFileDescriptor.detachFd(). Или оба.
Спасибо
РЕДАКТИРОВАТЬ: я получаю FD и detachFD работает. Но я так и не нашел ответ, как правильно заменить ftruncate, который тоже нуждается в записи, и я не нашел версию ftruncate, которая принимает файловый дескриптор как ввод
2 ответа
1) да, используйте файловые дескрипторы и fdopen 2)
- Открой
ParcelFileDescriptor
, - getFd().
- Передайте Fd в нативный код.
- Закрой
ParcelFileDescriptor
, (это закрывает вашу ссылку на Java)
Fd просто int
представляющий идентификатор linux для файла. На родном:
- Fdopen
- Делать вещи
- Fclose (обратите внимание, это закрывает ваш собственный указатель файла)
Два закрытия делают разные вещи.
Примечание: вам все еще нужно разрешение SAF для файла или более высокого уровня root.
Попробуйте ниже ссылки:
Android - запись / сохранение файлов только из собственного кода: Android - запись / сохранение файлов только из собственного кода
Android NDK Запись файла: Android NDK Запись файла
Файловые операции в Android NDK: Файловые операции в Android NDK