Я читаю и записываю файлы и каталоги из собственного кода C ++. Стандартный способ получения доступа к файлу - использовать Storage Access Framework на Java, а затем использовать дескриптор файла в собственном коде (https://developer.android.com/training/data-storage/files/media#native-code):
// Called from native code:
public void requestFile() {
Intent intent = new Intent(Intent.ACTION_CREATE_DOCUMENT);
intent.addCategory(Intent.CATEGORY_OPENABLE);
intent.addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION | Intent.FLAG_GRANT_WRITE_URI_PERMISSION);
startActivityForResult(intent, CREATE_REQUEST_CODE);
}
public native myNativeCallbackFunction(int fd, ...);
public void onActivityResult(int requestCode,
int resultCode, Intent resultData) {
Uri uri = resultData.getData();
ParcelFileDescriptor parcelFd = resolver.openFileDescriptor(uri, "r");
int fd = parcelFd.detachFd();
myNativeCallbackFunction(fd, "other information identifying the file such as the file name");
}
. Возвращенный Uri из onActivityResult
можетбыть сохраненным и повторно взятым, чтобы нам не приходилось каждый раз запрашивать у пользователя (https://developer.android.com/guide/topics/providers/document-provider#permissions):
final int takeFlags = intent.getFlags()
& (Intent.FLAG_GRANT_READ_URI_PERMISSION
| Intent.FLAG_GRANT_WRITE_URI_PERMISSION);
// Check for the freshest data.
getContentResolver().takePersistableUriPermission(uri, takeFlags);
Но есть некоторые местоположения (например, app.package/files
), к которым можно получить доступ безSAF:
- Есть ли способ определить, можно ли получить доступ к файлу / каталогу без SAF и без сохранения Uri из прошлого
onActivityResult
результата? - Есть либолее красивый способ переноса файлового дескриптора в собственный код, чем использование подхода
myNativeCallbackFunction
?
С уважением,