源码下载(免下载积分):下载
外部存储并不是一定可以访问的,例如外部存储挂载到电脑上是,或者是SD Card作为外部存储,被移除是,因此在访问外部存储时,一定要保证外部存储是可以获得的。判断外部存储是否已经挂载到了手机上可以这样判断:
//判断外部存储是否可以访问,并且可以读写
private boolean isExternalStorageWritable()
{
String state = Environment.getExternalStorageState();
if (Environment.MEDIA_MOUNTED.equals(state)) {
return true;
}
return false;
}
对于在外部存储的存储方式:
public files:文件可以被其他应用程序访问,并且在卸载应用程序以后会被删除
private files:卸载应用程序后,文件会被删除,
-
public files
创建并写入数据:
private void createPublicFile() {
//1. 判断是否外部存储可以访问
if (isExternalStorageWritable()) {
/*
*2. 使用getExternalStoragePublicDirectory方法来创建一个文件路径
* getExternalStoragePublicDirectory()方法会在外部存储中获得恰当的文件目录
* 参数表示的是文件的类型,DIRECTORY_PICTURES,DIRECTORY_DOWNLOADS等
*/
publicPath = new File(Environment.getExternalStoragePublicDirectory
(Environment.DIRECTORY_PICTURES), "myPictures");
//3.创建文件
publicFile = new File(publicPath,"1.png");
if (!publicPath.exists()) {
//创建此抽象路径名指定的目录,包括所有必需但不存在的父目录
if (!publicPath.mkdirs()) {
//这里抛出异常
throw new RuntimeException("不能创建所需目录");
}
}
//4. 向文件中写入数据
InputStream read = null;
FileOutputStream write = null;
try {
//Open a data stream for reading a raw resource
read = getResources().openRawResource(R.drawable.ic_launcher);
write = new FileOutputStream(publicFile);
byte[] data = new byte[read.available()];
//读取数据到data数组中
read.read(data);
write.write(data);
} catch (FileNotFoundException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
finally
{
try {
if (read != null)
read.close();
if (write != null)
write.close();
} catch (IOException e) {
e.printStackTrace();
}
}
//5. 告诉media scanner创建了新文件,目的为了使用户能立刻可以访问
MediaScannerConnection.scanFile(this,
new String[]{ publicFile.toString()}, null,
new MediaScannerConnection.OnScanCompletedListener() {
public void onScanCompleted(String publicPath, Uri uri) {
Log.e("public External Storeage", " Scanned "+publicPath+":");
Log.e("public External Storeage", " uri "+uri);
}
}
);
}
}
-
private files
其创建流程与public files的相同,只是在创建文件路径时使用的是getExternalFilesDir()
(这个是Context方法)方法
对于文件的删除,外部存储直接调用myFile.delete(),而对于内部存储的方式,就要调用
context.deleteFile(fileName);
对于在外部存储中创建缓存文件,可以调用getExternalCacheDir()方法,
权限:
对于外部存储应该添加相关的权限例如写数据:
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>
但对于android 4.4如果把文件存储为private files时不需要使用相关的权限