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