安卓外部存储,即将数据存储在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 }
MainActivity.class

相关文章:

  • 2021-11-12
  • 2021-05-17
  • 2021-10-17
  • 2021-11-16
  • 2021-09-22
  • 2022-12-23
  • 2021-11-30
猜你喜欢
  • 2022-12-23
  • 2022-12-23
  • 2022-12-23
  • 2021-12-09
  • 2021-07-29
  • 2022-12-23
  • 2021-08-27
相关资源
相似解决方案