安卓外部存储,即将数据存储在sdcard中,当然存储的前提是手机或者模拟器先具有sdcard目录
然而上一句话还是有歧义的。
事实上所有的安卓设备都有外部存储和内部存储,这两个名称来源于安卓的早期设备,那个时候的设备内部存储确实是固定的,而外部存储确实是可以像U盘一样移动的。但是在后来的设备中,很多中高端机器都将自己的机身存储扩展到了8G以上,他们将存储在概念上分成了"内部internal" 和"外部external" 两部分,但其实都在手机内部。所以不管安卓手机是否有可移动的sdcard,他们总是有外部存储和内部存储。最关键的是,我们都是通过相同的api来访问可移动的sdcard或者手机自带的存储(外部存储)。
因为存储空间有限,内部存储只适用于存储数据量小的情况,当数据量比较大的时候(存放下载的电影音乐等),就需要将数据外部存储
-------------------------------------------------------------------------------------------------------------------------------
开发的时候在创建模拟器的时候
这里SD Card 要设置一个大小,否则模拟器没有sdcard目录
--------------------------------------------------------------------------------------------------------------------------
1 public static final String IMAGE_URL = Environment.getExternalStorageDirectory()+"/myfile/image"; 2 public static final int FORMAT_PNG = 1; 3 public static final int FOEMAT_JPEG = 2;
一些外部存储需要的方法:
1、判断扩展卡是否存在
1 public static boolean isMounted(){ 2 String state = Environment.getExternalStorageState(); 3 return state.equals(Environment.MEDIA_MOUNTED); 4 }
2、获取指定路径下的文件的文件名
1 public static String getFileName(String path) 2 { 3 return path.substring(path.lastIndexOf("/")+1); 4 }
3、获得当前sd卡中剩余存储空间的大小(单位兆)
1 public static int remainedSize(){ 2 //文件系统状态管理对象StatFs 3 StatFs fs = new StatFs(Environment.getExternalStorageDirectory().getAbsolutePath()); 4 int count = fs.getFreeBlocks(); //空闲的数据块个数 5 int size = fs.getBlockSize(); //返回每个数据块的大小 6 7 //计算剩余空间 8 long total_byte = count*size; //字节单位的大小 9 int total_m = (int) (total_byte*size/1024/1024);//兆单位的大小 10 11 return total_m; 12 }
4、将字节格式的图片数据源保存到sdcard中
1 public static void saveImage(String path, byte data[]) throws IOException 2 { 3 //判断扩展卡是否挂载 4 if(!isMounted()) 5 return ; 6 File fileDir = new File(IMAGE_URL); 7 //如果路径下该文件目录不存在,则新建目录 8 if(!fileDir.exists()) 9 { 10 fileDir.mkdirs(); 11 } 12 13 FileOutputStream fos = new FileOutputStream(new File(fileDir,getFileName(path))); 14 fos.write(data); 15 fos.close(); 16 17 }
5、将Bitmap格式的图片存放到sd卡
public static void saveImage(String path,Bitmap bitmap , int format) throws FileNotFoundException { //判断扩展卡是否挂载 if(!isMounted()) return; //判断目录是否存在 File fileDir = new File(IMAGE_URL); //如果路径下该文件目录不存在,则新建目录 if(!fileDir.exists()) { fileDir.mkdirs(); } //把图片数据写入到一个图片文件 FileOutputStream fos = new FileOutputStream(new File(fileDir,getFileName(path))); //压缩图片 第一个参数是压缩后的格式,第二个参数是压缩后的效果,值越大,效果越好,第三个参数是输入流 bitmap.compress(format==1?CompressFormat.PNG:CompressFormat.JPEG, 100, fos); }
6、从扩展卡中读取指定路径图片数据
1 public static Bitmap readImage(String path) 2 { 3 if(!isMounted()) 4 return null; 5 //获得文件名 6 String fileName = getFileName(path); 7 File file = new File(IMAGE_URL,fileName); 8 Bitmap bitmap = null; 9 if(file.exists()) 10 { 11 bitmap = BitmapFactory.decodeFile(file.getAbsolutePath()); 12 } 13 return bitmap; 14 }
7、清空指定路径下的所有文件夹和文件
1 public static void clear(){ 2 //判断扩展卡是否挂载 3 if(!isMounted()) 4 return ; 5 File fileDir = new File(IMAGE_URL); 6 //如果指定目录存在 7 if(fileDir.exists()) 8 { 9 //获取指定目录下的所有文件及目录 10 File fileArray[] = fileDir.listFiles(); 11 for(File f:fileArray) 12 { 13 f.delete(); 14 } 15 } 16 }
---------------------------------------------------------------------------------------------------------------------------
Demo:从指定路径下载一张图片保存到sdcard下并显示在ImageView视图中,如果本地已存在,则不再下载,直接显示图片在ImageView中
1 package com.xqx_outer; 2 3 import tools.DownImageAsycnTask; 4 import tools.FileUtil; 5 import android.app.Activity; 6 import android.graphics.Bitmap; 7 import android.os.Bundle; 8 import android.view.View; 9 import android.view.View.OnClickListener; 10 import android.widget.Button; 11 import android.widget.ImageView; 12 13 public class MainActivity extends Activity { 14 15 private ImageView imageView; 16 private Button btn_down; 17 public static final String path = "http://images2015.cnblogs.com/blog/493196/201509/493196-20150909121120762-2089133734.jpg"; 18 @Override 19 protected void onCreate(Bundle savedInstanceState) { 20 super.onCreate(savedInstanceState); 21 setContentView(R.layout.activity_main); 22 imageView = (ImageView) findViewById(R.id.id_image); 23 btn_down = (Button) findViewById(R.id.id_btn); 24 25 26 btn_down.setOnClickListener(new OnClickListener() { 27 28 @Override 29 public void onClick(View v) { 30 // TODO Auto-generated method stub 31 ImageDownLoad(); 32 } 33 }); 34 } 35 36 public void ImageDownLoad() 37 { 38 Bitmap bitmap = null; 39 //先从扩展卡中读取指定路径下的图片 40 bitmap = FileUtil.readImage(path); 41 //如果图片存在,则将图片放在图片视图中 42 if(bitmap!=null) 43 { 44 imageView.setImageBitmap(bitmap); 45 } 46 //如果不存在,开启异步任务下载图片 47 else 48 { 49 new DownImageAsycnTask(imageView).execute(path); 50 51 } 52 53 54 } 55 }