从Android Q开始,引入了一些限制文件访问权限的变化,这也适用于NDK代码。具体来说,Android Q引入了Scoped Storage,它限制了应用对外部存储的直接访问,而是通过媒体存储库或应用特定目录来访问文件。
如果你的NDK代码需要访问外部存储的文件,可以使用以下方法:
Uri uri = MediaStore.Images.Media.EXTERNAL_CONTENT_URI;
String[] projection = {MediaStore.Images.Media._ID, MediaStore.Images.Media.DISPLAY_NAME};
String selection = MediaStore.Images.Media.DATA + " like ?";
String[] selectionArgs = new String[]{"%my_image.jpg%"};
String sortOrder = MediaStore.Images.Media.DATE_MODIFIED + " DESC";
Cursor cursor = getContentResolver().query(uri, projection, selection, selectionArgs, sortOrder);
if (cursor != null && cursor.moveToFirst()) {
String fileName = cursor.getString(cursor.getColumnIndexOrThrow(MediaStore.Images.Media.DISPLAY_NAME));
// 根据文件名读取文件内容或进行其他操作
cursor.close();
}
File file = new File(context.getExternalFilesDir(Environment.DIRECTORY_DOWNLOADS), "my_file.txt");
try {
FileInputStream fis = new FileInputStream(file);
// 读取文件内容或进行其他操作
fis.close();
} catch (IOException e) {
e.printStackTrace();
}
需要注意的是,以上方法仅适用于Android Q及以上的版本。对于较早的Android版本,可以继续使用传统的文件访问方式。