确定Android Q

时间:2019-10-24 05:20:40

标签: android android-ndk file-access android-10.0 storage-access-framework

我正在从本地C ++代码读取和写入文件和目录。获取文件访问的标准方法是使用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");
}

onActivityResult返回的Uri可以存储并重新使用,这样我们就不必每次都提示用户(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的情况下访问文件/目录,并且没有过去onActivityResult结果中存储的Uri?
  2. 与使用myNativeCallbackFunction函数方法相比,将文件描述符传输到本机代码是否有更优美的方式?

此致

1 个答案:

答案 0 :(得分:1)

   intent.addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION | Intent.FLAG_GRANT_WRITE_URI_PERMISSION);

删除该行。这没有道理。您不能在那里授予任何东西。

getFilesDir(), getExternalFilesDir() and getExternalFilesDirs()是仍然可以使用经典File类的地方。

更多:原则上,您不必像getPermanentUriPermissions()那样存储获得的uri,您可以随时看到它们。

但是,如果您拥有多个权限,您将不知道哪个权限适用于哪个。因此也需要保存自我。