我对android开发非常陌生,请给我一个初学者的帮助...
我正在创建一个应具有2个目录,一个Databases目录和一个Images目录的应用程序,就像Whatsapp一样。
我想在浏览手机时在文件管理器中看到这些目录,就像您看到其他应用程序文件夹一样。 我尝试了在这里找到的所有内容,并通过代码在内部存储和外部存储中创建了它。该文件夹似乎已创建,但是当我浏览手机的文件管理器时,找不到带有应用程序名称的文件夹,而在其中没有我的数据库和图像文件夹... 我究竟做错了什么?我需要在android studio中创建这些文件夹作为添加文件夹吗?还是我需要通过代码创建它?
您能给我完成该任务所需要做的动作吗? 我正在使用android studio 3.1.3。 感谢您的帮手! :)
答案 0 :(得分:2)
起初,“ 内部存储”和“ 外部存储”这两个术语可能会造成混淆,因为Google的意图与我们今天的期望和认识有所不同,日常使用的语言:“外部”不一定表示“ SD卡”。 This guy made a great article about the terminology confusion
根据您的意图,您希望使用外部存储概念。 Documentation中对这些差异进行了很好的解释,但我将在这里向您简要介绍它们。
最后,我将为您提供一个示例,但首先让您了解基本知识:
内部存储
外部存储
因此,既然我们知道您需要外部存储,那么在开始之前需要完成几件事:
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(cashback.getBytes());
outputStream.flush();
outputStream.close();
} catch (Exception e) {
e.printStackTrace();
}
}
我想专门回答您的一些问题:
我是否需要在android studio中创建这些文件夹作为添加文件夹?还是我需要通过代码创建它?
绝对不是通过Android Studio。这些是您的项目文件夹,其中包含您的代码。上面提到了这样做的方法。
我找不到包含我的应用程序名称的文件夹,并且在其中没有我的Databases和Images文件夹...我在做什么错了?
可能您已将文件另存为内部存储文件/已将它们另存为项目文件夹,而这些文件不会(也不应该)显示。
有用的事情要知道
有两种类型的目录:公共目录和私有目录。
私有
getExternalFilesDir(...)
方法检索 示例: WhatsApp
目录(在我的手机中)位于根目录级别。称为:getExternalFilesDir("WhatsApp/...")
公共(下载/电影/图片库)
Environment.getExternalStoragePublicDirectory(...)
方法检索 示例:获得Documents
文件夹的样子如下:Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_DOCUMENTS)
答案 1 :(得分:0)
主要的答案真的帮了我大忙,如果没有那个很好的答案,我就无法做到这一点。
但是我在获取存储目录时遇到了一些困难(因为 API 随着时间的推移发生了变化)并且我使用的是 Kotlin,所以我想我只是分享我使用的最终代码。
我的也返回一个字符串消息(文件的绝对路径为成功,否则为错误消息)。
我还添加了一些 Log 语句,以便您可以查看正在发生的事情。
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;
}
}