Я пишу приложение, чтобы включить ряд заметок, расчетов, дневник и другие полезные функции. Когда доступна внешняя SD-карта, я хочу иметь возможность редактировать, сохранять, переименовывать, удалять и т. Д. Непосредственно на SD-карту.
Чтобы избежать осложнений, и поскольку это в основном для моего личного использования, в настоящее время я ориентируюсь на уровни API 24-27.
Я включил разрешение WRITE_EXTERNAL_STORAGE, что означает, что я могу работать с основными «внутренними» файлами хранения, и checkSelfPermissions
возвращает PERMISSION_GRANTED, как и ожидалось.
Для внешней SD-карты я могу прочитать все содержимое, открыть файлы и т. Д. После прочтения различных очень полезных ссылок, в частности Универсальный способ записи на внешнюю SD-карту в Android , я вроде бы ожидал checkSelfPermissions
вызов не возвращать PERMISSION_GRANTED. Тем не менее, он все еще делает.
Мне кажется, проблема в том, что я просто проверяю, разрешено ли разрешение WRITE_EXTERNAL_STORAGE, но я специально не делаю checkSelfPermissions
для внешней SD-карты.
Когда я отслеживаю, что происходит в двух случаях (например, переименование файла в обычной «внутренней» файловой системе или попытка переименовать файл на внешней SD-карте), все кажется идентичным, никаких проблем, но файл не переименован.
В приведенном ниже коде показаны различные вызовы (фрагмент)
@Override
public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions,
@NonNull int[] grantResults) {
if (grantResults.length > 0) {
Log.d(TAG,"onRequestPermissionsResult="+grantResults[0]);
}
else {
Log.d(TAG,"request cancelled!!");
}
switch (requestCode) {
case REQUEST_CODE_STORAGE_PERMISSION:
// If request is cancelled, the result arrays are empty.
if (grantResults.length > 0 && grantResults[0] == PERMISSION_GRANTED) {
toastMessage("Permission granted!");
} else {
toastMessage("Permission denied :-(");
}
break;
}
}
private boolean hasPermissions() {
Log.d(TAG,"check if has permissions");
boolean temp = ActivityCompat.checkSelfPermission(getContext(),
WRITE_EXTERNAL_STORAGE) == PERMISSION_GRANTED;
Log.d(TAG,"has permissions= "+temp);
return temp;
}
private void requestPermissions() {
Log.d(TAG,"requesting permission");
requestPermissions(new String[]{WRITE_EXTERNAL_STORAGE}, REQUEST_CODE_STORAGE_PERMISSION);
}
И я попытался явно запросить разрешения непосредственно перед переименованием:
dirName = this.currentDirectory.getPath() + "/" + data.getDataString();
Log.d(TAG,"rename to "+dirName);
File g = new File(dirName);
File f = directoryEntries.get(hPos).getFile();
requestPermissions();
f.renameTo(g);
Log.d(TAG,"file renamed");
Возвращения идентичны независимо от того, требуется ли доступ к «внутренней» памяти или к внешней SD-карте. И системный диалог не вызывается, когда выполняется вызов requestPermissions
(предположительно, потому что ничто из вышеперечисленного не относится к внешней SD-карте, а фактически просто проверяет, что разрешение WRITE_EXTERNAL_STORAGE включено (и, следовательно, просто проверяет, снова , что приложение может записывать в внутреннее хранилище).
Как сделать запрос специфичным для внешней SD-карты?