当前位置: 移动技术网 > 移动技术>移动开发>Android > Android获取SD卡路径及SDCard内存的方法

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

2019年07月24日  | 移动技术网移动技术  | 我要评论

本文实例讲述了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程序设计有所帮助。

如对本文有疑问, 点击进行留言回复!!

相关文章:

验证码:
移动技术网