SD卡使用的是FAT(File Allocation Table)的文件系统,不支持访问模式和权限控制,SD卡适用于保存大尺寸的文件或者是一些无需设置访问权限的文件 Android模拟器支持SD卡,但模拟器中没有缺省的SD卡,开发人员须在模拟器中手工添加SD卡的映像文件 为了读\写SD卡上的文件,必须在AndroidManifest.xml中添加读\写SD卡的权限 在SD卡上创建与删除文件的权限 Android.permission.MOUNT_UNMOUNT_FIFESYSTEMS 向SD卡写入数据的权限 Android.permission.WRITE_EXTERNAL_STORAGE
编程访问SD卡方法一 首先需要检测系统的/mnt/sdcard目录是否可用 使用文件的输入输出流对SD卡里的文件进行读写 编程访问SD卡方法二 调用Environment的getExternalStorageState()方法判断手机上是否有SD卡,并且应用程序具有读写SD卡的权限 Environment.getExternalStorageState().equals(Environment.MEDIA_MOUNTED) 调用Environment的getExternalStorageDirectory()方法来获取外部存储器,也就是SD卡的根目录 使用文件的输入输出流对SD卡里的文件进行读写.
核心代码
写入文件到sd卡 //如果手机插入了SD卡,而且应用程序具有访问SD的权限 if (Environment.getExternalStorageState() .equals(Environment.MEDIA_MOUNTED)) { //获取SD卡的目录 File sdCardDir = Environment.getExternalStorageDirectory(); File targetFile = new File(sdCardDir.getCanonicalPath()+ FILE_NAME); //以指定文件创建 RandomAccessFile对象,第一个参数是文件名称,第二个参数是读写模式 RandomAccessFile raf = new RandomAccessFile(targetFile , "rw"); //将文件记录指针移动到最后 raf.seek(targetFile.length()); // 输出文件内容 raf.write(content.getBytes()); raf.close(); }
读取sd卡的文件 //如果手机插入了SD卡,而且应用程序具有访问SD的权限 if (Environment.getExternalStorageState() .equals(Environment.MEDIA_MOUNTED)) { //获取SD卡对应的存储目录 File sdCardDir = Environment.getExternalStorageDirectory(); //获取指定文件对应的输入流 FileInputStream fis = new FileInputStream(sdCardDir.getCanonicalPath() + FILE_NAME); //将指定输入流包装成BufferedReader BufferedReader br = new BufferedReader(new InputStreamReader(fis)); StringBuilder sb = new StringBuilder(""); String line = null; //一直读,直到读到最后跳出 while((line = br.readLine()) != null) { //一直追加读出的内容 sb.append(line); } //返回读出的内容,并把它转化为字符串 return sb.toString(); }
注意,还要加权限 <!-- 在SD卡中创建与删除文件权限 --> <uses-permission android:name="android.permission.MOUNT_UNMOUNT_FILESYSTEMS"/> <!-- 向SD卡写入数据权限 --> <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>
下面列举一个实例,主要是按下写入按钮后把EditText的内容写入到sd卡里,然后按下读取按钮后就可以把sd卡里的文件读出来
第一步是编写main.xml文件

1 <?xml version="1.0" encoding="utf-8"?> 2 <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" 3 android:orientation="vertical" 4 android:layout_width="fill_parent" 5 android:layout_height="fill_parent"> 6 <EditText android:id="@+id/edit1" 7 android:layout_width="fill_parent" 8 android:layout_height="wrap_content" 9 android:lines="4"/> 10 <Button android:id="@+id/write" 11 android:layout_width="wrap_content" 12 android:layout_height="wrap_content" 13 android:text="@string/write"/> 14 <EditText android:id="@+id/edit2" 15 android:layout_width="fill_parent" 16 android:layout_height="wrap_content" 17 android:editable="false" 18 android:cursorVisible="false" 19 android:lines="4"/> 20 <Button android:id="@+id/read" 21 android:layout_width="wrap_content" 22 android:layout_height="wrap_content" 23 android:text="@string/read"/> 24 </LinearLayout>
第二步:写入核心代码:

1 package cn.edu.zwu.tel; 2 3 import java.io.BufferedReader; 4 import java.io.File; 5 import java.io.FileInputStream; 6 import java.io.InputStreamReader; 7 import java.io.RandomAccessFile; 8 import android.app.Activity; 9 import android.os.Bundle; 10 import android.os.Environment; 11 import android.view.View; 12 import android.view.View.OnClickListener; 13 import android.widget.Button; 14 import android.widget.EditText; 15 import android.os.Bundle; 16 17 public class FileSDsaveTest02Activity extends Activity 18 { 19 final String FILE_NAME = "/FileSDTest.ini"; 20 21 @Override 22 public void onCreate(Bundle savedInstanceState) 23 { 24 super.onCreate(savedInstanceState); 25 setContentView(R.layout.main); 26 // 获取两个按钮 27 Button read = (Button) findViewById(R.id.read); 28 Button write = (Button) findViewById(R.id.write); 29 // 获取两个文本框 30 final EditText edit1 = (EditText) findViewById(R.id.edit1); 31 final EditText edit2 = (EditText) findViewById(R.id.edit2); 32 // 为write按钮绑定事件监听器 33 write.setOnClickListener(new OnClickListener() 34 { 35 @Override 36 public void onClick(View source) 37 { 38 // 将edit1中的内容写入文件中 39 write(edit1.getText().toString()); 40 edit1.setText(""); 41 } 42 }); 43 44 read.setOnClickListener(new OnClickListener() 45 { 46 @Override 47 public void onClick(View v) 48 { 49 // 读取指定文件中的内容,并显示出来 50 edit2.setText(read()); 51 } 52 }); 53 } 54 55 private String read() 56 { 57 try 58 { 59 //如果手机插入了SD卡,而且应用程序具有访问SD的权限 60 if (Environment.getExternalStorageState() 61 .equals(Environment.MEDIA_MOUNTED)) 62 { 63 //获取SD卡对应的存储目录 64 File sdCardDir = Environment.getExternalStorageDirectory(); 65 //获取指定文件对应的输入流 66 FileInputStream fis = new FileInputStream(sdCardDir 67 .getCanonicalPath() + FILE_NAME); 68 //将指定输入流包装成BufferedReader 69 BufferedReader br = new BufferedReader(new 70 InputStreamReader(fis)); 71 StringBuilder sb = new StringBuilder(""); 72 String line = null; 73 while((line = br.readLine()) != null) 74 { 75 sb.append(line); 76 } 77 return sb.toString(); 78 } 79 } 80 catch (Exception e) 81 { 82 e.printStackTrace(); 83 } 84 return null; 85 } 86 87 private void write(String content) 88 { 89 try 90 { 91 //如果手机插入了SD卡,而且应用程序具有访问SD的权限 92 if (Environment.getExternalStorageState() 93 .equals(Environment.MEDIA_MOUNTED)) 94 { 95 //获取SD卡的目录 96 File sdCardDir = Environment.getExternalStorageDirectory(); 97 File targetFile = new File(sdCardDir.getCanonicalPath() 98 + FILE_NAME); 99 //以指定文件创建 RandomAccessFile对象,第一个参数是文件名称,第二个参数是读写模式100 RandomAccessFile raf = new RandomAccessFile( 101 targetFile , "rw"); 102 //将文件记录指针移动到最后103 raf.seek(targetFile.length()); 104 // 输出文件内容105 raf.write(content.getBytes()); 106 raf.close(); 107 } 108 } 109 catch (Exception e) 110 { 111 e.printStackTrace(); 112 } 113 } 114 }
第三步:修改AndroidMainFest文件,主要是加入权限

1 <?xml version="1.0" encoding="utf-8"?> 2 <manifest xmlns:android="http://schemas.android.com/apk/res/android" 3 package="cn.edu.zwu.tel" 4 android:versionCode="1" 5 android:versionName="1.0" > 6 7 <uses-sdk android:minSdkVersion="8" /> 8 9 <application 10 android:icon="@drawable/ic_launcher" 11 android:label="@string/app_name" > 12 <activity 13 android:name=".FileSDsaveTest02Activity" 14 android:label="@string/app_name" > 15 <intent-filter> 16 <action android:name="android.intent.action.MAIN" /> 17 18 <category android:name="android.intent.category.LAUNCHER" /> 19 </intent-filter> 20 </activity> 21 </application> 22 <!-- 在SD卡中创建与删除文件权限 --> 23 <uses-permission android:name="android.permission.MOUNT_UNMOUNT_FILESYSTEMS"/> 24 <!-- 向SD卡写入数据权限 --> 25 <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/> 26 </manifest>
效果图: