十一长假过去了,也是时候恢复学习了,大家要劳逸结合,不能太辛苦,也不能太懒啊~(哈哈……自我安慰)
由于是长假刚刚结束,我想大家可能还没调整好,么四儿,这一期我们就讲解一下如何获取手机内存和内存卡的空间大小(主要是Android:StatFs类),算是一个小实例,循序渐进嘛,哈哈……发现我真能为自己的懒找借口……
好了,废话不多说
内存大小的展现需要一个TextView,我们新建一个项目时可不需更改任何代码,只需为TextView添加一个id,其代码如下:
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:paddingBottom="@dimen/activity_vertical_margin"
android:paddingLeft="@dimen/activity_horizontal_margin"
android:paddingRight="@dimen/activity_horizontal_margin"
android:paddingTop="@dimen/activity_vertical_margin"
tools:context=".MainActivity" >
<TextView
android:id="@+id/et_size"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="@string/hello_world" />
</RelativeLayout>
布局文件写好,我们需要去读取内存大小,然后再TextView上进行展现,故而不需要点击事件,只需重写TextView的内容即可,
MainActivity.java
package com.hackerant.memorysize;
import java.io.File;
import android.annotation.SuppressLint;
import android.app.Activity;
import android.content.Context;
import android.os.Bundle;
import android.os.Environment;
import android.os.StatFs;
import android.text.format.Formatter;
import android.view.Menu;
import android.widget.TextView;
public class MainActivity extends Activity
{
private TextView etSize;
@Override
protected void onCreate(Bundle savedInstanceState)
{
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
etSize = (TextView) findViewById(R.id.et_size);
etSize.setText(getSDSize(this) + getRoomSize(this));
}
@SuppressLint("NewApi")
/**
* 获取内存卡大小
* @param context
* @return
*/
public String getSDSize(Context context){
String totalSize = "0K";
String availSize = "0K";
//获取SD卡文件
File path = Environment.getExternalStorageDirectory();
//用于获取大小
StatFs statFs = new StatFs(path.getPath());
//getBlockCountLong()在API18以上版本方可使用
long block = statFs.getBlockCount();
long size = statFs.getBlockSize();
long avail = statFs.getAvailableBlocks();
totalSize = Formatter.formatFileSize(context, block * size);
availSize = Formatter.formatFileSize(context, size * avail);
return "内存卡信息:" + "\n"
+ "总空间:" + totalSize
+ "\n" + "可用空间:" +availSize + "\n";
}
@SuppressLint("NewApi")
/**
* 获取内存大小
* @param context
* @return
*/
public String getRoomSize(Context context){
String totalSize = "0K";
String availSize = "0K";
//获取SD卡文件
File path = Environment.getDataDirectory();
//用于获取大小
StatFs statFs = new StatFs(path.getPath());
long block = statFs.getBlockCount();
long size = statFs.getBlockSize();
long avail = statFs.getAvailableBlocks();
totalSize = Formatter.formatFileSize(context, block * size);
availSize = Formatter.formatFileSize(context, size * avail);
return "内存信息:" + "\n"
+ "总空间:" + totalSize
+ "\n" + "可用空间:" +availSize;
}
@Override
public boolean onCreateOptionsMenu(Menu menu)
{
// Inflate the menu; this adds items to the action bar if it is present.
getMenuInflater().inflate(R.menu.main, menu);
return true;
}
}
代码中statFs.getBlockCount()为获取当前存储空间一共多少块,statFs.getBlockSize()为每块大小,statFs.getAvailableBlocks()为可用块数,要想获得空间大小,需块数*块大小即可,Formatter.formatFileSize()为安卓系统源码对空间进行格式化的代码,可直接使用,也可自己去除1024获得。
其效果图如下:
说明:
1、getBlockCount()、getAvailableBlocks()、getBlockSize()均为低版本写法,系统已经建议不要再用,高版本的均在后面加入long
2、本代码中没有判断内存卡是否存在而直接默认存在并使用,若无内存卡会报错。之前已经讲过内存卡是否存在,请使用者自行加上。
另需要源码的朋友可至http://pan.baidu.com/s/12X9Iu下载