Определите существующие права доступа к файлам на Android Q - PullRequest
0 голосов
/ 24 октября 2019

Я читаю и записываю файлы и каталоги из собственного кода 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:

  1. Есть ли способ определить, можно ли получить доступ к файлу / каталогу без SAF и без сохранения Uri из прошлого onActivityResult результата?
  2. Есть либолее красивый способ переноса файлового дескриптора в собственный код, чем использование подхода myNativeCallbackFunction?

С уважением,

1 Ответ

1 голос
/ 24 октября 2019
   intent.addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION | Intent.FLAG_GRANT_WRITE_URI_PERMISSION);

Удалить эту строку. Это не имеет никакого смысла. Вы не можете ничего там предоставить.

getFilesDir(), getExternalFilesDir() and getExternalFilesDirs() - это места, где вы все еще можете использовать классические классы файлов.

Далее: В принципе вам не нужно хранить полученный урис, как при getPermanentUriPermissions() вы всегда можете их увидеть.

Но если у вас есть более одного разрешения, вы не будете знать, какое из них для чего. Так что хранить себя тоже нужно.

...