Android, Java, Создать каталог на SD-карте программно с помощью Storage Access Framework (SAF) - PullRequest
0 голосов
/ 05 августа 2020

Моя проблема в том, что мне не удается создать каталог на SD-карте, подключенной к переносному устройству Android. Ниже приведен код Java, который я пытаюсь заставить работать: Я пытаюсь создать каталог sable в /storage/BF4F-1107/:

public class AnActivity extends AppCompatActivity
{
private static final int N_CREATE_DIRECTORY = 1;

    protected void onCreate(Bundle savedInstanceState)
    {
        super.onCreate(savedInstanceState);

        // SD card
        String s_sdCardStorage = "/storage/BF4F-1107/";

        Intent intent = new Intent(Intent.ACTION_CREATE_DOCUMENT);
        intent.addCategory(Intent.CATEGORY_OPENABLE);
        intent.setType("file/*");
        intent.putExtra(Intent.EXTRA_TITLE, s_destFilePath);
        startActivityForResult(intent, N_CREATE_DIRECTORY);
        // HERE
    }

    @Override
    protected void onActivityResult(int requestCode, int resultCode, Intent data)
    {
        if(requestCode == N_CREATE_DIRECTORY)
        {
            if(data != null)
            {
                Uri uri = data.getData();
                DocumentFile docFileSDCardStorage = DocumentFile.fromSingleUri(this, uri);

                try
                {
                    DocumentFile docFileDir = docFileSDCardStorage.createDirectory("sable");
                }
                catch(UnsupportedOperationException exn)
                {
                    System.out.println(exn.getMessage());
                }
            }
        }
    }
}

Что происходит:

  • выполняется код из onCreate().
  • Затем программа блокирует // HERE.
  • На портативном устройстве появляется «диалоговое окно», в котором отображается /storage/BF4F-1107/ и кнопка Save, который я «нажимаю».
  • После «нажатия» выполняется код из onActivityResult().

Но в результате каталог sable в /storage/BF4F-1107/ не создается. И путь выполнения проходит через предложение catch, возникает исключение UnsupportedOperationException и null печатается в System.out.println(exn.getMessage());.

Edit 2: пустой файл _storage_BF4F-1107_ создается в /storage/BF4F-1107/.

Можете ли вы помочь мне заставить этот код работать?

Кроме того, я бы хотел, чтобы каталог sable создавался незаметно. Я не хочу, чтобы пользователь нажимал «Сохранить».

Я пытаюсь использовать Storage Access Framework (https://developer.android.com/training/data-storage/shared/documents-files), потому что метод mkdirs из java.io.File класс не работает (я получаю исключения с отказом в разрешении), когда я пытаюсь создать каталог на SD-карте.

Изменить: моя Android версия 6.0.1

Спасибо .

1 Ответ

1 голос
/ 05 августа 2020

Используйте ACTION_OPEN_DOCUMENT_TREE, чтобы позволить пользователю выбрать SD-карту.

После этого вы можете создать столько файлов и каталогов в выбранном каталоге.

Если вы хотите создать только один файл с SAF использует ACTION_CREATE_DOCUMENT, где пользователь выбирает местоположение и имя файла.

...