Я новичок в разработке Android, и мне нужна помощь новичков, пожалуйста ...
Я создаю приложение, которое должно иметь 2 каталога, каталог баз данных и каталог изображений, как и в Whatsapp.
Я хочу видеть эти каталоги в диспетчере файлов, когда просматриваю свой телефон, так же, как вы видите папки других приложений. Я попробовал все, что нашел здесь, чтобы создать это во внутреннем хранилище и во внешнем хранилище из кода. Кажется, что папки созданы, но когда я просмотрел диспетчер файлов своего телефона, я не смог найти папку с именем моего приложения и внутри нее мои папки с базами данных и изображениями ... Что я делаю неправильно? мне нужно создать эти папки в студии Android как добавляющие папки? или мне нужно создать его из кода?
Не могли бы вы рассказать мне о действиях, которые мне нужно сделать для выполнения этой задачи? Я использую android studio 3.1.3. Спасибо за помощников! :)





Термины «Внутреннее хранилище» и «Внешнее хранилище» могут сначала сбивать с толку, потому что намерения Google отличаются от того, что мы ожидаем и знаем из повседневного использования языка: «Внешний» не обязательно означает «SD-карта. ". Этот парень написал отличную статью о путанице в терминологии
Согласно вашим намерениям, вы хотите работать с концепцией Внешнее хранилище. Различия хорошо объяснены в Документация, но я кратко расскажу о них здесь.
В конце я приведу вам пример, но сначала расскажу об основах:
Внутреннее хранилище
Внешнее хранилище
Итак, теперь, когда мы знаем, что вам нужно внешнее хранилище, перед запуском необходимо сделать несколько вещей:
Manifest.xml, в зависимости от ваших потребностей: <manifest ...>
<uses-permission android:name = "android.permission.READ_EXTERNAL_STORAGE" />
<uses-permission android:name = "android.permission.WRITE_EXTERNAL_STORAGE" />
...
</manifest>
Каждое разрешение стоит отдельно, а это означает, что вам не нужно иметь оба, если, например, вы хотите только читать файлы, а не записывать их.
В данном методе мы сохраним текстовый файл внутри корневого каталога.
Кредиты для эта статья
public void writeFileExternalStorage() {
//Text of the Document
String textToWrite = "bla bla bla";
//Checking the availability state of the External Storage.
String state = Environment.getExternalStorageState();
if (!Environment.MEDIA_MOUNTED.equals(state)) {
//If it isn't mounted - we can't write into it.
return;
}
//Create a new file that points to the root directory, with the given name:
File file = new File(getExternalFilesDir(null), filenameExternal);
//This point and below is responsible for the write operation
FileOutputStream outputStream = null;
try {
file.createNewFile();
//second argument of FileOutputStream constructor indicates whether
//to append or create new file if one exists
outputStream = new FileOutputStream(file, true);
outputStream.write(textToWrite.getBytes());
outputStream.flush();
outputStream.close();
} catch (Exception e) {
e.printStackTrace();
}
}
Хочу конкретно ответить на некоторые из ваших вопросов:
do I need to create those folders in the android studio as adding folders? or do I need to create it from code?
Определенно не через Android Studio. Это папка ваших проектов, содержащая ваш код. Как это сделать, указано выше.
I couldn't find the folder with my app name and inside it my Databases and Images folders... What am I doing wrong?
Вероятно, вы сохранили ваши файлы как файлы внутреннего хранилища / сохранили их как папки проекта, как вы упомянули ранее - и они не будут (и не должны) отображаться.
Полезные вещи знать
Есть 2 типа каталогов: публичные и частные.
Частный
getExternalFilesDir(...)Пример: каталог WhatsApp (в моем телефоне) находится прямо на корневом уровне. Назвать это будет: getExternalFilesDir("WhatsApp/...")
Общественные (Загрузки / Фильмы / Библиотеки изображений)
Environment.getExternalStoragePublicDirectory(...)Пример: получение папки Documents будет выглядеть так: Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_DOCUMENTS)
Код, который я использовал для создания папки: String DirName = "MyAppName"; Файл dir = новый файл (Environment.getExternalStorageDirectory (), DirName); если (! dir.exists ()) {dir.mkdirs (); }
Я думаю, вы хотите использовать new File(getExternalFilesDir(), DirName) вместо getExternalStoragePublicDirectory(). Другое дело: файл должен указывать на файл, а не на каталог. попробуйте изменить DirName на "MyAppName / TestFile.txt" и посмотрите, работает ли это для вас
С getExternalFilesDir () путь будет /storage/emulated/0/Android/data/com.example.../DirName/file s /, и я хочу, чтобы путь был / storage / emulated / 0 / DirName /. использует новый файл (Environment.getExternalStorageDirectory (), DirName), если это неверно? а для изменения DirName на «MyAppName / TestFile.txt» я хочу создать пустой каталог и заполнить его командами приложения в коде. Есть ли другой способ сделать это? а почему я не вижу созданный каталог? Еще раз спасибо всем за помощь! :) (תודה רבה!)
И как правильно создать пустой каталог, не используя File?
Прошу прощения - запуталась насчет getExternalFilesDir. Я выяснил, в чем может быть ваша проблема (я сам пробовал сейчас, она работает) - проблема с разрешением: перейдите в настройки телефона -> приложения -> найдите свое приложение и установите для разрешения хранилища значение true. Кроме того, перед публикацией приложения вам нужно создать всплывающее диалоговое окно с запросом разрешения для пользователей с версией Android> 6 (Marshmallow). настройки разрешения в Manifest.xml недостаточно для Marshmallow и выше. Попробуйте и дайте мне знать, сработало ли это. יף :)
Да, сработало! вот в чем проблема! Спасибо, вы мне очень помогли! :) מעריכה, תודה רבה! :)
outputStream.write(cashback.getBytes()) - я думаю, вы имели в виду textToWrite, а не cashback. ;)
Главный ответ действительно помог мне, и я не смог бы до него добраться без этого отличного ответа.
Но у меня возникли некоторые трудности с получением каталога хранилища (из-за изменений в API с течением времени), и я использую Kotlin, поэтому я подумал, что просто поделюсь своим последним кодом, который я использовал.
Mine также возвращает сообщение String (абсолютный путь к файлу - успех, в противном случае - сообщение об ошибке).
Я также добавил несколько операторов журнала, чтобы вы могли наблюдать за происходящим.
fun writeFileExternalStorage() :String {
var fileData : String = "test this"
Log.i("FirstFrag", "in writeFileExternalStorage")
//Checking the availability state of the External Storage.
val state = Environment.getExternalStorageState()
if (Environment.MEDIA_MOUNTED != state) {
Log.i("FirstFrag", "Couldn't get file system.")
return "Couldn't write file."
}
var file =File(requireContext().getExternalFilesDir(Environment.DIRECTORY_DOWNLOADS), "test.txt")
Log.i("FirstFrag", file.absolutePath)
//This point and below is responsible for the write operation
var outputStream: FileOutputStream? = null
try {
Log.i("FirstFrag", "creating new file")
file.createNewFile()
Log.i("FirstFrag", "file created")
//second argument of FileOutputStream constructor indicates whether
//to append or create new file if one exists
outputStream = FileOutputStream(file, true)
outputStream?.write(fileData.toByteArray())
outputStream?.flush()
outputStream?.close()
Log.i("FirstFrag", "wrote file!")
return file.absolutePath
} catch (e: Exception) {
Log.i("FirstFrag",e.message.toString())
return e.message.toString() + "\nPlease check that you have a valid filename."
}
finally {
isRetrievingFile = false;
}
}
Большое спасибо за подробный и быстрый ответ! еще один вопрос по этому поводу. путь к файлу, который я создал, на моем телефоне: /storage/emulated/0/Android/data/com.example.../files/FileNa меня, когда я использовал getExternalFilesDir. Я хотел создать каталоги в: / storage / emulated / 0 / AppName, поэтому я использовал Environment.getExternalStorageDirectory (). При отладке путь был правильным, и казалось, что папка создана, но я не могу найти ее на телефоне и на компьютере. где я ошибся здесь? для WhatsApp, например, путь / storage / emulated / 0 / WhatsApp /