Не удается создать файл на внешнем накопителе USB?

1

Я работал над проектом, где я должен сохранить текстовый файл на внешнем USB-устройстве, подключенном к устройству Android. Я дал разрешения READ_EXTERNAL_STORAGE/WRITE_EXTERNAL_STORAGE в моем файле манифеста. Вот что я сделал.

 boolean Available= false;
    String state = Environment.getExternalStorageState();
    if(Environment.MEDIA_MOUNTED.equals(state)){
        // Both Read and write operations available
        Available= true;
    } else {
        // SD card not mounted
        Available = false;
    }
    if(Available) {


        File f = new File(Environment.getExternalStorageDirectory() +     
    "/file");
        if (!f.exists())
            if (!f.mkdir()) {
                Toast.makeText(this, myfolder + " can't be created.", 
         Toast.LENGTH_SHORT).show();

            } else
                Toast.makeText(this, myfolder + " can be created.", 
         Toast.LENGTH_SHORT).show();
    }

Я проверил устройство для вставки или нет, после чего я попытался получить путь, вызвав Environment.getExternalStorageDirectory(). Но когда я создаю новый файл, он всегда дает мне ответ, неспособный создать каталог. Пожалуйста, кто-нибудь может мне помочь с этим.

Теги:
android-external-storage

2 ответа

1

Не уверен насчет ошибки трассировки стека, о которой вы упоминали в комментарии, но если вы предоставите разрешение в настройках, ваш код должен работать.

Изображение 174551

Вероятно, лучшая вещь - это проверить разрешение и только если доступно, продолжить с логикой хранения, что-то вроде:

boolean Available = false;
 if (ContextCompat.checkSelfPermission(this,
   Manifest.permission.WRITE_EXTERNAL_STORAGE) != 
      PackageManager.PERMISSION_GRANTED) {
   Toast.makeText(this, "Grant the external storage permission first!",
                    Toast.LENGTH_SHORT).show();
 } else {
   // then do your rest of the storage checks and logic.
 }

Смотрите здесь более подробную информацию о том, как обрабатывать запрос на разрешение.

Также обратите внимание, что вам, вероятно, нужно использовать папку, которую вы объявили, поэтому вместо:

File f = new File(Environment.getExternalStorageDirectory() +     
    "/file");

Вы должны использовать:

File f = new File(myfolder, "file");
  • 0
    Я проверил разрешение, оно входит в остальную часть, что означает, что я уже дал разрешение в методе onCreate и файле манифеста. Проблема в том, что когда я создаю каталог файлов, то есть (file.mkdirs ()), он всегда не может создать файл, и поэтому я не могу выполнить дальнейшие операции записи файла.
0

Наряду с ответом, предоставленным @Dan для добавления прав доступа во время выполнения кода, вам также необходимо настроить файловый провайдер для версий Android 7.0 и выше. Вам необходимо добавить следующие изменения.

Добавьте это в manifest.xml

<provider
    android:name="android.support.v4.content.FileProvider"
    android:authorities="com.yourappname.fileprovider"
    android:exported="false"
    android:grantUriPermissions="true" >
    <meta-data
        android:name="android.support.FILE_PROVIDER_PATHS"
        android:resource="@xml/my_paths" />
</provider>

создайте my_paths.xml в my_paths.xml res/xml/:

<paths xmlns:android="http://schemas.android.com/apk/res/android">
    <files-path name="files" path="." />
</paths> 

Проверьте документацию для получения дополнительной информации.

  • 0
    Должен ли я указать путь к внешнему файлу my_paths в моей папке myfolder в File f = new File (myfolder, "file"); Нужно ли сохранять данные в my_paths, а затем передавать их на внешний USB ???
  • 0
    проверьте документацию по разным путям для разных случаев.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню