Java学习者论坛

 找回密码
 立即注册

QQ登录

只需一步,快速开始

手机号码,快捷登录

恭喜Java学习者论坛(https://www.javaxxz.com)已经为数万Java学习者服务超过8年了!积累会员资料超过10000G+
成为本站VIP会员,下载本站10000G+会员资源,购买链接:点击进入购买VIP会员
JAVA高级面试进阶视频教程Java架构师系统进阶VIP课程

分布式高可用全栈开发微服务教程

Go语言视频零基础入门到精通

Java架构师3期(课件+源码)

Java开发全终端实战租房项目视频教程

SpringBoot2.X入门到高级使用教程

大数据培训第六期全套视频教程

深度学习(CNN RNN GAN)算法原理

Java亿级流量电商系统视频教程

互联网架构师视频教程

年薪50万Spark2.0从入门到精通

年薪50万!人工智能学习路线教程

年薪50万!大数据从入门到精通学习路线年薪50万!机器学习入门到精通视频教程
仿小米商城类app和小程序视频教程深度学习数据分析基础到实战最新黑马javaEE2.1就业课程从 0到JVM实战高手教程 MySQL入门到精通教程
查看: 623|回复: 0

[实例教程]Android 小项目之--解析如何获取SDCard 内存

[复制链接]

该用户从未签到

发表于 2011-10-22 12:21:21 | 显示全部楼层 |阅读模式
继上篇音乐播放器,我们讲到使用 SDCard 播放音乐的例子,上篇也将如何在 Android 模拟器中创建 SDCard 的步骤列了出来。本篇将扩展上篇例子,去获取SDCard 的所存内存,显示出来告诉用户。本篇讲述的内容如下:
1、讲述 Environment 类。
2、讲述 StatFs 类。
3、完整例子读取 SDCard 内存

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;

    }

}
TIP:要判断手机是否安装了存储卡,可通过 Environment.getExternalStorageState()方法来判断存储卡的状态。如果你不知道如何创建 SDCard 你可回头看我上篇文章:点击这里






实例运行效果如图上篇放了两首歌和一个30多M的音频文件,之前创建时给的500MB空间,现在剩下的刚好。源码下载:

getSdCardStorage.rar (43.58 KB, 下载次数: 7)
回复

使用道具 举报

该用户从未签到

发表于 2011-10-22 12:21:26 | 显示全部楼层

Re:[实例教程]Android

不错不错。
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|手机版|Java学习者论坛 ( 声明:本站资料整理自互联网,用于Java学习者交流学习使用,对资料版权不负任何法律责任,若有侵权请及时联系客服屏蔽删除 )

GMT+8, 2024-12-23 05:23 , Processed in 0.647251 second(s), 47 queries .

Powered by Discuz! X3.4

© 2001-2017 Comsenz Inc.

快速回复 返回顶部 返回列表