将安卓应用数据存储在SD卡上

31

有没有办法将安卓应用程序的数据存储在SD卡上,而不是内部存储空间中? 我知道如何将应用程序SQLite数据库从内部存储转移到SD卡,但如果内部存储空间首先满了呢?每个人都是如何处理这种情况的呢?

6个回答

76

使用 Environment.getExternalStorageDirectory() 而不是硬编码 "/sdcard" 是更好的实践。

并不总是可以确定文件夹名称将被称为该名称。此外,Environment类提供了一个 getExternalStorageState() 方法来检查外部存储器是否可用。


2
这并不总是有效,因为显然三星的真正SD卡位置是Environment.getExternalStorageDirectory()+"/external_sd"。其他设备将有不同的位置。 - Muz

33

开始:

根据不同的机型/操作系统,您可以通过以下方式访问SD卡根目录:

File externalStorage = Environment.getExternalStorageDirectory();

这将指向内部SD存储或内部SD内存。

externalStorage.getAbsolutePath() 

将返回以下值之一

"/sdcard/" 或 "/mnt/sdcard/"

为了访问外部SD卡存储器或micro SD卡,通常从手机/平板电脑的外部插入,你必须使用其中一个Android创建的文件夹来指向外部存储器:

"/mnt/sdcard/sd" 
"/mnt/sdcard/external_sd"

"/sdcard/external_sd"
"/sdcard/sd" 

"/mnt/sdcard/"

提示: 你可以看到在内部存储的空文件夹external_sd或者sd, 这个文件夹是用来指向外部micro SD卡的。

最后, 确保在android manifest xml中有读/写SD卡的权限 android.permission.WRITE_EXTERNAL_STORAGE.

最后,您需要指定文件名,然后就可以开始了。

private SQLiteDatabase DB = null;

private static final String DATABASE_NAME = "MyDb.db"; 
////////////
File sdcard = Environment.getExternalStorageDirectory();

String dbfile = sdcard.getAbsolutePath() + File.separator+ "external_sd" + File.separator + DATABASE_NAME;

DB = SQLiteDatabase.openDatabase(dbfile, null,SQLiteDatabase.NO_LOCALIZED_COLLATORS);
///////////

你准备好了,就可以开始了...


2
很不幸,这绝对不是标准的做法。在LG Optimus上,它位于/mnt/sdcard/_ExternalSD目录下。我希望有人在谷歌能够审查一下这个问题。媒体命名方式太糟糕了(外部???),而且文档中没有提到如何访问内置的第二张SD卡。 - Snicolas
请问您能帮忙获取SD卡中所有文件夹的名称吗? - Sumit Sharma

13

10

警告:此答案已过时。应该使用Environment.getExternalStorageDirectory()来获取SD卡的根路径,如下面的回答所述。

旧版本答案如下以保证评论内容的准确性:

/sdcard/添加到您的根路径中,应该可以让您的Android应用程序使用SD卡(至少对于G1手机是这样的)。 Android文件系统对象使您能够检查文件大小......因此,应该可以编写一些容错代码(虽然有些棘手)。当内部存储填满时,此代码将调整您的根路径。


你如何调整根路径? - user121196
调整您正在使用的根路径。(有点混乱...您无法更改Android的根路径) - haseman
我正在使用SQLiteDatabase创建数据库,但是它的构造函数的名称参数不能包含路径,那么我如何在SD卡上创建数据库呢? - user121196
2
使用openDatabase调用。它将路径作为第一个参数。 - haseman
我正在使用SQLiteOpenHelper,它不需要任何路径。 - user121196
@user121196,如果答案无效,为什么要接受它呢?不如接受其他有效的答案如何? - Jeff Axelrod

3

有些设备将/mnt/sdcard用作SD卡的根目录。


2

使用SD卡的问题在于,当应用程序需要时,您不能可靠地假定它始终存在。这在内部存储器上并非如此。只要您的应用程序不依赖于此数据运行,就应该没有问题。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接