在SD卡上存储android应用程序数据

use*_*196 30 android memory-management android-sdcard

有没有办法将Android应用程序数据存储在SD卡而不是内部存储器中?我知道如何将应用程序sqlite数据库从内部存储器传输到SDCard,但是如果内部存储器首先变满了怎么办?每个人如何处理这个?

yin*_*ash 76

使用Environment.getExternalStorageDirectory()比使用硬编码"/ sdcard" 更好的做法.并不总是确定将调用文件夹名称.此外,Environment类提供了一个getExternalStorageState()方法来检查外部存储是否可用.

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

Rab*_*arb 33

开始:

根据型号/操作系统,您可以使用以下命令访问SD卡根目录:

File externalStorage = Environment.getExternalStorageDirectory();
Run Code Online (Sandbox Code Playgroud)

这将引用内部sd存储或内部sd内存.

externalStorage.getAbsolutePath() 
Run Code Online (Sandbox Code Playgroud)

将返回以下值之一

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

要访问通常从手机/平板电脑外部插入的外部SD内存或micro SD,您必须使用android创建的以下文件夹之一指向外部内存:

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

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

"/mnt/sdcard/"
Run Code Online (Sandbox Code Playgroud)

ps:您可以注意到一个空文件夹external_sdsd内部SD卡

内存,此文件夹为空,用于指向外部micro sd卡.

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

最后你必须指定文件名并准备就绪

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);
///////////
Run Code Online (Sandbox Code Playgroud)

你准备好了......

  • 不幸的是,这绝对不是标准.在LG Optimus上,它位于/ mnt/sdcard/_ExternalSD中.我希望谷歌的某个人会审查所有这些.媒体的命名是如此糟糕(外部???)和文档没有说明当有一个内置时如何访问第二个SD卡. (2认同)

phr*_*eed 13

这是另一个巧妙的小技巧.的应用有许多这是所谓的获取路径的方法.特别是应用程序具有getDatabasePath方法,由SQLiteOpenHelper用于构造路径.自定义应用程序类可以覆盖这些方法,以提供不同的路径,包括getExternalStorageDirectory中的路径.

外部存储是特定于应用程序的或公共的.有方法,分别替换getExternalStorageDirectory机制, getExternalFilesDir()getExternalStoragePublicDirectory().


has*_*man 9

警告:这个答案已经过时了.您应该使用Environment.getExternalStorageDirectory()来获取SD卡的根路径,如下面的答案中所述.

旧答案所以对此的评论是有道理的:

添加/sdcard/到根目录的路径应该指示您的Android应用程序使用SD卡(至少它与G1一起工作).Android的文件系统对象使您能够检查文件大小...因此应该可以(如果有点棘手)编写一些故障转移代码.如果内部存储器已满,此代码将调整您的根路径.

  • http://developer.android.com/reference/android/database/sqlite/SQLiteDatabase.html#openDatabase%28java.lang.String,%20android.database.sqlite.SQLiteDatabase.CursorFactory,%20int%29使用openDatabase调用.它将路径作为第一个参数 (2认同)