Не удается создать файл на внешнем накопителе USB? - PullRequest
0 голосов
/ 13 февраля 2019

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

Ответы [ 2 ]

0 голосов
/ 18 февраля 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> 

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

0 голосов
/ 13 февраля 2019

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

Grant permission

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

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.
 }

См. здесь подробнее о том, как обрабатывать разрешениеrequest.

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

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

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

File f = new File(myfolder, "file");
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...