我正在开发一个地图应用程序,该应用程序的地图文件不在其资产或原始文件中,而是在用户手机上,例如country.map,所以我如何通过授予正确的权限Media.IMAGES或Media.AUDIO或Media.VIDEO来访问并不代表我的文件。请给我一些解决方案。预先感谢!
我尝试添加所有这些权限,但在我的 Android 智能手机版本 13 中没有任何文件和媒体权限,这些是权限:
<uses-permission android:name="android.permission.MOUNT_UNMOUNT_FILESYSTEMS" tools:ignore="ProtectedPermissions" /><uses-permission android:name="android.permission.WRITE_MEDIA_STORAGE" tools:ignore="ProtectedPermissions" /><uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" /><uses-permission android:name="android.permission.READ_MEDIA_AUDIO" /><uses-permission android:name="android.permission.READ_MEDIA_IMAGES" /><uses-permission android:name="android.permission.READ_MEDIA_VIDEO" /><uses-permission android:name="android.permission.READ_MEDIA_FILES" tools:ignore="SystemPermissionTypo" /><uses-permission android:name="android.permission.MEDIA_CONTENT_CONTROL" tools:ignore="ProtectedPermissions" /><uses-permission android:name="android.permission.MANAGE_MEDIA" tools:ignore="ProtectedPermissions" /><uses-permission android:name="android.permission.CALL_PHONE" /><uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" /><uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" /><uses-permission android:name="android.permission.MANAGE_EXTERNAL_STORAGE" tools:ignore="ScopedStorage" /><uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" /><uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" /><uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" /><uses-permission android:name="android.permission.READ_PHONE_STATE" />
最后经过大量研究,我找到了解决方案,对于 12 以下的 Android 版本,我们需要添加存储权限,但对于 13 及以上版本,如果您访问自己的文件并由自己生成,则不需要该权限。只需保存并访问您的文件,对于我的地图文件,这是我用于提取到外部存储的代码,
private void unzip(File zipFile, File destination) throws IOException {
ZipInputStream zis = new ZipInputStream(new FileInputStream(zipFile));
ZipEntry entry;
byte[] buffer = new byte[1024];
int count;
while ((entry = zis.getNextEntry()) != null) {
File file;
if (entry.isDirectory()) {
file = new File(destination, entry.getName());
file.mkdirs();
} else {
String entryName = entry.getName();
String folderName = "daero" + File.separator + "maps";
String relativePath = entryName.substring(entryName.indexOf('/') + 1); // Removing the first directory from the path
file = new File(destination, folderName + File.separator + relativePath);
File parentDir = file.getParentFile();
if (parentDir != null && !parentDir.exists()) {
parentDir.mkdirs();
}
if (file.exists()) {
file.delete();
}
FileOutputStream fos = new FileOutputStream(file);
BufferedOutputStream bos = new BufferedOutputStream(fos);
while ((count = zis.read(buffer)) != -1) {
bos.write(buffer, 0, count);
}
bos.flush();
bos.close();
}
zis.closeEntry();
}
zis.close();
}