Как вызвать системный диалог, чтобы разрешить запись на внешнюю SD-карту - PullRequest
0 голосов
/ 23 марта 2019

Я пишу приложение, чтобы включить ряд заметок, расчетов, дневник и другие полезные функции. Когда доступна внешняя 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-карты?

...