欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  移动技术

Android获取SD卡路径及SDCard内存的方法

程序员文章站 2022-06-23 10:31:50
本文实例讲述了android获取sd卡路径及sdcard内存的方法。分享给大家供大家参考。具体分析如下: 昨天在研究拍照后突破的存储路径的问题,开始存储路径写死为: pr...

本文实例讲述了android获取sd卡路径及sdcard内存的方法。分享给大家供大家参考。具体分析如下:

昨天在研究拍照后突破的存储路径的问题,开始存储路径写死为: private string folder = "/sdcard/dcim/camera/"(sd卡上拍照程序的图片存储路径); 后来发现这样写虽然一般不会出错,但不是很好,因为不同相机,可能路径会出问题。较好的方法是通过environment 来获取路径,最后给出一个例子,教你怎样获取sdcard 的内存,显示出来告诉用户。讲述的内容如下:

0、获取sd卡路径。
1、讲述 environment 类。
2、讲述 statfs 类。
3、完整例子读取 sdcard 内存

0、获取sd卡路径

方法一:

复制代码 代码如下:
private string folder = "/sdcard/dcim/camera/"(sd卡上拍照程序的图片存储路径); //写死绝对路径,不赞成使用

方法二:

复制代码 代码如下:
public string getsdpath(){
       file sddir = null;
       boolean sdcardexist = environment.getexternalstoragestate()  
       .equals(android.os.environment.media_mounted);//判断sd卡是否存在
       if(sdcardexist)  
       {                              
         sddir = environment.getexternalstoragedirectory();//获取跟目录
      }  
       return sddir.tostring();
}

然后:在后面加上斜杠,在加上文件名

复制代码 代码如下:
string filename = getsdpath() +"/" + name;//以name存在目录中

1、讲述 environment 类

environment 是一个提供访问环境变量的类。
environment 包含常量:

media_bad_removal
解释:返回getexternalstoragestate() ,表明sdcard 被卸载前己被移除
media_checking
解释:返回getexternalstoragestate() ,表明对象正在磁盘检查。
media_mounted
解释:返回getexternalstoragestate() ,表明对象是否存在并具有读/写权限
media_mounted_read_only
解释:返回getexternalstoragestate() ,表明对象权限为只读
media_nofs
解释:返回getexternalstoragestate() ,表明对象为空白或正在使用不受支持的文件系统。
media_removed
解释:返回getexternalstoragestate() ,如果不存在 sdcard 返回
media_shared
解释:返回getexternalstoragestate() ,如果 sdcard 未安装 ,并通过 usb 大容量存储共享 返回
media_unmountable
解释:返回getexternalstoragestate() ,返回 sdcard 不可被安装 如果 sdcard 是存在但不可以被安装
media_unmounted
解释:返回getexternalstoragestate() ,返回 sdcard 已卸掉如果 sdcard   是存在但是没有被安装

environment 常用方法:

方法:getdatadirectory()
解释:返回 file ,获取 android 数据目录。
方法:getdownloadcachedirectory()
解释:返回 file ,获取 android 下载/缓存内容目录。
方法:getexternalstoragedirectory()
解释:返回 file ,获取外部存储目录即 sdcard
方法:getexternalstoragepublicdirectory(string type)
解释:返回 file ,取一个高端的公用的外部存储器目录来摆放某些类型的文件
方法:getexternalstoragestate()
解释:返回 file ,获取外部存储设备的当前状态
方法:getrootdirectory()
解释:返回 file ,获取 android 的根目录
2、讲述 statfs 类
statfs 一个模拟linux的df命令的一个类,获得sd卡和手机内存的使用情况
statfs 常用方法:

getavailableblocks()
解释:返回 int ,获取当前可用的存储空间
getblockcount()
解释:返回 int ,获取该区域可用的文件系统数
getblocksize()
解释:返回 int ,大小,以字节为单位,一个文件系统
getfreeblocks()
解释:返回 int ,该块区域剩余的空间
restat(string path)
解释:执行一个由该对象所引用的文件系统
3、完整例子读取 sdcard 内存
存储卡在 android 手机上是可以随时插拔的,每次的动作都对引起操作系统进行 action_broadcast,本例子将使用上面学到的方法,计算出 sdcard 的剩余容量和总容量。代码如下:

复制代码 代码如下:
package com.terry;

import java.io.file;
import java.text.decimalformat;

import android.r.integer;
import android.app.activity;
import android.os.bundle;
import android.os.environment;
import android.os.statfs;
import android.view.view;
import android.view.view.onclicklistener;
import android.widget.button;
import android.widget.progressbar;
import android.widget.textview;
import android.widget.toast;
public class getstorageactivity extends activity {
private button mybutton;
/** called when the activity is first created. */
@override
public
void oncreate(bundle savedinstancestate) {
      super.oncreate(savedinstancestate);
       setcontentview(r.layout.main);
       findview();
       viewholder.mybutton.setonclicklistener(new onclicklistener() {
         @override
         public
void onclick(view arg0) {
            // todo auto-generated method stub
            getsize();
         }
       });
}
void findview(){
       viewholder.mybutton=(button)findviewbyid(r.id.button01);
       viewholder.mybar=(progressbar)findviewbyid(r.id.myprogressbar);
       viewholder.mytextview=(textview)findviewbyid(r.id.mytextview);
}
void getsize(){
       viewholder.mytextview.settext("");
       viewholder.mybar.setprogress(0);
      //判断是否有插入存储卡
if(environment.getexternalstoragestate().equals(environment.media_mounted)){
         file path =environment.getexternalstoragedirectory();
         //取得sdcard文件路径
         statfs statfs=new statfs(path.getpath());
         //获取block的size
long blocsize=statfs.getblocksize();
         //获取block数量
long totalblocks=statfs.getblockcount();
         //己使用的block的数量
long availablock=statfs.getavailableblocks();
         string[] total=filesize(totalblocks*blocsize);
         string[] availale=filesize(availablock*blocsize);
         //设置进度条的最大值
int maxvalue=integer.parseint(availale[0])
         *viewholder.mybar.getmax()/integer.parseint(total[0]);
         viewholder.mybar.setprogress(maxvalue);
         string text="总共:"+total[0]+total[1]+"/n"
+"可用:"+availale[0]+availale[1];
         viewholder.mytextview.settext(text);
       }else
if(environment.getexternalstoragestate().equals(environment.media_removed)){
         toast.maketext(getstorageactivity.this, "没有sdcard",1000).show();
       }
}
//返回数组,下标1代表大小,下标2代表单位 kb/mb
string[] filesize(long size){
       string str="";
      if(size>=1024){
         str="kb";
         size/=1024;
         if(size>=1024){
            str="mb";
            size/=1024;
         }
       }
       decimalformat formatter=new decimalformat();
       formatter.setgroupingsize(3);
       string result[] =new string[2];
       result[0]=formatter.format(size);
       result[1]=str;
      return result;
}
}

希望本文所述对大家的android程序设计有所帮助。