Не переименовывается файл в Android 10
Написал решение для переименования файлов, но в Android 10 ничего не происходит, хотя в 11 и выше переименовывается нормально.
public class PathDiv {
public static String dev(String path){
return path.replaceAll("^(.*)/.*?$","$1");
}
public static void renameFilesInDir(String path, String dirIn, String ext) {
File checkFile = new File(path);
if (checkFile.isFile()) {
try {
checkFile.renameTo(new File(dirIn, ext));
} catch (Exception e) {
e.printStackTrace();
}
}
}
Метод renameTo возвращает значение false
path: /storage/emulated/0/Music/04. Kasger - Highland.mp3 dirIn: /storage/emulated/0/Music ext: Highland.mp3
PathDiv.renameFilesInDir(songItem.realUri,PathDiv.dev(songItem.realUri),newName.toString())
Помогите пожалуйста, в чем проблема?
private fun updateOrRequestPermissions() {
val hasReadPermission = ContextCompat.checkSelfPermission(
this,
Manifest.permission.READ_EXTERNAL_STORAGE
) == PackageManager.PERMISSION_GRANTED
val hasWritePermission = ContextCompat.checkSelfPermission(
this,
Manifest.permission.WRITE_EXTERNAL_STORAGE
) == PackageManager.PERMISSION_GRANTED
val minSdk29 = Build.VERSION.SDK_INT >= Build.VERSION_CODES.Q
readPermissionGranted = hasReadPermission
writePermissionGranted = hasWritePermission || minSdk29
val permissionsToRequest = mutableListOf<String>()
if (!writePermissionGranted) {
permissionsToRequest.add(Manifest.permission.WRITE_EXTERNAL_STORAGE)
}
if (!readPermissionGranted) {
permissionsToRequest.add(Manifest.permission.READ_EXTERNAL_STORAGE)
}
if (permissionsToRequest.isNotEmpty()) {
permissionsLauncher.launch(permissionsToRequest.toTypedArray())
}
}
Ответы (1 шт):
Проблема в том, что у вашего приложения нет доступа к файлу.
На А11+ вы можете создавать файлы в стандартных директориях без каких либо привелегий, но чужие файлы удалять/изменять таким способом нельзя, кроме того если приложение удалить а потом установить снова, доступа к этим файлам уже не будет.
На А10 доступ к файлам вне собственных папок приложения возможен только с флагом в манифесте:
<manifest ... >
<!-- This attribute is "false" by default on apps targeting
Android 10. -->
<application android:requestLegacyExternalStorage="true" ... >
...
</application>
</manifest>
Кроме того на Андроид 10 и ниже для записи файлов требуется привилегия android.permission.WRITE_EXTERNAL_STORAGE - нужно не только объявить в манифесте, но и запросить в коде перед попыткой работы с файлом.
UPD: у вас не запрашивается привилегия записи на А10 и выше включительно, исправьте на А11:
val minSdk30 = Build.VERSION.SDK_INT >= Build.VERSION_CODES.R
...
writePermissionGranted = hasWritePermission || minSdk30
