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

Я работал над проектом, в котором мне нужно сохранить текстовый файл на внешнем 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 (). Но когда я создаю новый файл, он всегда дает мне ответ, что не могу создать каталог. Пожалуйста, любой может помочь мне с этим.


person J.Doe    schedule 13.02.2019    source источник
comment
Я пробовал и .mkdir (), и mkdirs (). Я хочу сохранить файл на USB-накопителе, но проблема в том, что он вызывает исключение файла, который не найден.   -  person J.Doe    schedule 13.02.2019
comment
Вы также должны указать в вопросе трассировку стека исключения.   -  person dan    schedule 13.02.2019
comment
Они не являются исключением: этот тост вызывается каждый раз, когда говорится, что папка не может быть создана.   -  person J.Doe    schedule 13.02.2019
comment
В предыдущем комментарии вы сказали: выдает исключение из файла, который не найден, вы должны перехватить это исключение и обновить вопрос с его помощью.   -  person dan    schedule 13.02.2019
comment
вы установили файлового провайдера?   -  person karan    schedule 18.02.2019


Ответы (2)


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

Предоставить разрешение

Вероятно, лучше всего проверить разрешение и, только если оно доступно, выполнить логику хранения, например:

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");
person dan    schedule 13.02.2019
comment
Я проверил разрешение, оно переходит в часть else, что означает, что я уже дал разрешение в методе onCreate и файле манифеста. Проблема в том, что когда я создаю каталог файлов, то есть (file.mkdirs ()), он всегда не может создать файл, и поэтому я не могу выполнять дальнейшие операции по записи файла. - person J.Doe; 18.02.2019

Наряду с ответом, предоставленным @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 в папке res/xml/:

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

Дополнительную информацию см. В документации.

person karan    schedule 18.02.2019
comment
я должен указать путь к внешнему файлу my_paths в моем каталоге myfolder в File f = new File (myfolder, file); Надо ли сохранять данные в my_paths, а затем передавать их на внешний usb ??? - person J.Doe; 19.02.2019
comment
проверьте документацию, у него разные пути для разных случаев. - person karan; 19.02.2019