У меня есть приложение для Android, которое использует много родного кода C++. Приложение должно работать с файлами, расположенными на SD-карте (читать, создавать, добавлять). Но Kitkat + отказал в написании sdcard для сторонних приложений. Android 5 представил новый API, который позволяет это снова.Android lollipop написать sdcard из родного кода C++
How to use the new SD card access API presented for Android 5.0 (Lollipop)?
Все примеры и документация, что я нашел в основном для Java стороны. Примеры для собственного кода не существуют или очень неясны. Поэтому я хочу задать несколько вопросов.
Ссылка выше содержит ценный пример того, как получить DocumentFile, который может вернуть ParcelFileDescriptor. Из этого объекта я могу получить собственный дескриптор файла - ParcelFileDescriptor.getFd(). Это целое число, которое я отправляю на C++-код через jni.
В C++ открываем файл с fdopen (fd).
Мои вопросы:
- ли fdopen функция правильный способ, как открыть файл с новым API? Или DocumentFile уже открывает файл, и я должен использовать только fd в дальнейших операциях.
- Достаточно закрыть дескриптор файла внутри собственного кода с помощью fclose? или я должен закрыть его на стороне Java с помощью ParcelFileDescriptor.detachFd(). Или оба.
Спасибо
EDIT: Я getFD и detachFD работает. Но я никогда не находил ответ, как правильно заменить ftruncate, который необходим доступ на запись тоже, и я не нашел ftruncate версии, которая принимает дескриптор файла как вход
Hi, спасибо. Эти ссылки очень полезны. Но, к сожалению, не актуально, если файловая система защищена SAF https://developer.android.com/guide/topics/providers/document-provider.html – user1063364
В настоящее время я использую ParcelFileDescriptor.detachFd(), и я отправляю ее на собственный код. Затем файл закрывается функцией fclose(). Но я получаю это предупреждение: W/ParcelFileDescriptor: равносильный ожидаемый сигнал при закрытии; не удалось доставить после отсоединения .... – user1063364