确定 Android Q 上的现有文件访问权限
Determine existing file access permissions on Android Q
我正在从本机 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 的情况下访问:
- 有没有一种方法可以确定 file/directory 是否可以在没有 SAF 且没有来自过去
onActivityResult
结果的已存储 Uri 的情况下访问?
- 有没有比使用
myNativeCallbackFunction
函数方法更漂亮的将文件描述符传输到本机代码的方法?
此致,
intent.addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION | Intent.FLAG_GRANT_WRITE_URI_PERMISSION);
删除该行。这没有道理。你不能在那里授予任何东西。
getFilesDir(), getExternalFilesDir() and getExternalFilesDirs()
是您仍然可以使用经典文件的地方 类。
进一步:原则上你不必存储获得的 uris,因为 getPermanentUriPermissions()
你总是可以看到它们。
但是,如果您拥有多个权限,您将不知道哪个是哪个权限。所以存储自我也是必要的。
我正在从本机 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 的情况下访问:
- 有没有一种方法可以确定 file/directory 是否可以在没有 SAF 且没有来自过去
onActivityResult
结果的已存储 Uri 的情况下访问? - 有没有比使用
myNativeCallbackFunction
函数方法更漂亮的将文件描述符传输到本机代码的方法?
此致,
intent.addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION | Intent.FLAG_GRANT_WRITE_URI_PERMISSION);
删除该行。这没有道理。你不能在那里授予任何东西。
getFilesDir(), getExternalFilesDir() and getExternalFilesDirs()
是您仍然可以使用经典文件的地方 类。
进一步:原则上你不必存储获得的 uris,因为 getPermanentUriPermissions()
你总是可以看到它们。
但是,如果您拥有多个权限,您将不知道哪个是哪个权限。所以存储自我也是必要的。