Мне нужно открывать файлы по имени файла в приложениях Android в собственном коде C/C++. Собственный код — это сторонние библиотеки, которые я бы предпочел не изменять, но они часто требуют имя файла в качестве аргумента для чтения/записи файлов. С API-интерфейсом Google «хранилища с ограниченной областью действия» и отключением собственного доступа к файлам в Android 10 или более поздних версиях это настоящая проблема.
Одно из хорошо известных решений — получить дескриптор файла и использовать «proc». /self/fd/FD_NUMER», например:
ParcelFileDescriptor mParcelFileDescriptor = null;
Код: Выделить всё
String getFileNameThatICanUseInNativeCode(Context context, DocumentFile doc) {
try {
Uri uri = doc.getUri();
mParcelFileDescriptor =
context.getContentResolver().openFileDescriptor(uri, "r");
if (mParcelFileDescriptor != null) {
int fd = mParcelFileDescriptor.getFd();
return "/proc/self/fd/" + fd;
}
}
catch (FileNotFoundException fne) {
return "";
}
}
// Don't forget to close mParcelFileDescriptor when done!
Передача этого в собственный код C/C++ работает, но
только если файл находится в основной памяти телефона. Если пользователь пытается открыть файл, находящийся на внешней SD-карте, вставленной в слот телефона, у него ничего не получается — для файла, открытого таким образом, нет разрешения на чтение. Я могу только получить int номер дескриптора файла и использовать fdopen(fd). Но это потребует изменения исходного кода сторонних библиотек (с открытым исходным кодом или лицензированных) и большой головной боли при каждом обновлении исходного кода этих библиотек.
Есть ли лучшее решение к этой проблеме? И нет, я не хочу слышать решение с добавлением
Код: Выделить всё
android:requestLegacyExternalStorage="true"
в раздел приложений AndroidManifest.xml — Google угрожает отключить это в следующей версии Android в 2020 году, поэтому необходимо постоянное решение. Еще одно простое, но глупое решение — скопировать весь (возможно, огромный) файл, который пользователь пытается открыть, в личный каталог приложения. Тупой и бесполезный...
Подробнее здесь:
https://stackoverflow.com/questions/590 ... torage-api