获取手机的总内存和可用的内存信息等(这里所值的手机的总内存指的是Ram内存,可用的内存指的是手机可用的rom内存信息)思路:
"/proc/meminfo"文件记录了android手机的一些内存信息,在命令行窗口里输入"adb shell",进入shell环境,输入"cat /proc/meminfo"即可在命令行里显示meminfo文件的内容
C:\Users\Figo>adb shell# cat /proc/meminfocat /proc/meminfoMemTotal: 94096 kBMemFree: 1684 kBBuffers: 16 kBCached: 27160 kB
MemTotal: 所有可用RAM大小。
MemFree: LowFree与HighFree的总和,被系统留着未使用的内存。
所以要获得手机的内存信息只需读取"/proc/meminfo"文件的第1行,并进行简单的字符串处理即可。
第二种方法:(利用Android提供的一组内部的API来实现)
Android系统提供了Environment 和StatFs两个类,配合可以实现对存储设备容量的查看。
Environment: 获取系统中的存储设备信息
getDataDirectory(): 获取应用存储空间文件对象。
getExternalStorageDirectory(): 获取外部存储设备及SD卡文件对象。
getRootDirectory(): 获取系统空间文件对象。
StatFs: 用于获取具体文件的信息。
getBlockCount(): 获取存储块数量。
getAvailableBlocks(): 获取可用的存储块数量。
getBlockSize(): 获取存储块大小。
因为Android是基于Linux系统的,所以其没有盘符的概念,而且是以存储块来存储数据。所以获得容量的正确方式为:
1. 通过Environment获取需要检测容量的文件对象。
2. 构建StatFs对象。
3. 获取存储块数量。
4. 获取存储块大小。
5. 计算得出容量大小。
通过getBlockSize()方法获取出来的值,是以字节做单位。
package com.luochuang.programView;
import java.io.File;
import android.app.Activity;
import android.os.Bundle;
import android.os.Environment;
import android.os.StatFs;
import android.text.format.Formatter;
import android.widget.TextView;
public class ProgramViewActivity extends Activity {
private TextView app_manager_avail_sd;
private TextView app_manager_avail_mem;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.app_manager);
app_manager_avail_sd = (TextView) findViewById(R.id.tv_app_manager_avail_sd);
app_manager_avail_mem = (TextView) findViewById(R.id.tv_app_manager_avail_mem);
app_manager_avail_sd.setText("SD卡可用内存" + getAvailSdSize());
app_manager_avail_mem.setText("手机剩余内存:" + getInternalAvailSize());
}
/***
* 获取可用的sd卡的空间
*/
public String getAvailSdSize() {
File path = Environment.getExternalStorageDirectory();
// StatFs:检索有关整体上的一个文件系统的空间信息
StatFs stat = new StatFs(path.getPath());
// 一个文件系统的块大小,以字节为单位。
long blockSize = stat.getBlockSize();
// SD卡中可用的块数
long availableBlocks = stat.getAvailableBlocks();
return Formatter.formatFileSize(this, blockSize * blockSize);
}
/**
* 获取手机的内部存储设备的可用空间
*/
public String getInternalAvailSize() {
StatFs mDataFileStats = new StatFs("/data");
long freeStorage = (long) mDataFileStats.getAvailableBlocks()
* mDataFileStats.getBlockSize();
return Formatter.formatFileSize(this, freeStorage);
}
}
遇到的错误:
07-10 16:53:14.923: E/AndroidRuntime(394): java.lang.RuntimeException: Unable to start activity ComponentInfo{com.luochuang.programView/com.luochuang.programView.ProgramViewActivity}: java.lang.RuntimeException: Binary XML file line #56: You must supply a layout_width attribute.
07-10 16:53:14.923: E/AndroidRuntime(394): at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2663)
07-10 16:53:14.923: E/AndroidRuntime(394): at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2679)
07-10 16:53:14.923: E/AndroidRuntime(394): at android.app.ActivityThread.access$2300(ActivityThread.java:125)
07-10 16:53:14.923: E/AndroidRuntime(394): at android.app.ActivityThread$H.handleMessage(ActivityThread.java:2033)
07-10 16:53:14.923: E/AndroidRuntime(394): at android.os.Handler.dispatchMessage(Handler.java:99)
07-10 16:53:14.923: E/AndroidRuntime(394): at android.os.Looper.loop(Looper.java:123)
07-10 16:53:14.923: E/AndroidRuntime(394): at android.app.ActivityThread.main(ActivityThread.java:4627)
07-10 16:53:14.923: E/AndroidRuntime(394): at java.lang.reflect.Method.invokeNative(Native Method)
07-10 16:53:14.923: E/AndroidRuntime(394): at java.lang.reflect.Method.invoke(Method.java:521)
07-10 16:53:14.923: E/AndroidRuntime(394): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:868)
07-10 16:53:14.923: E/AndroidRuntime(394): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:626)
07-10 16:53:14.923: E/AndroidRuntime(394): at dalvik.system.NativeStart.main(Native Method)
07-10 16:53:14.923: E/AndroidRuntime(394): Caused by: java.lang.RuntimeException: Binary XML file line #56: You must supply a layout_width attribute.-----------------------------------------------XML文件的56行出现了错误。多了个标签
07-10 16:53:14.923: E/AndroidRuntime(394): at android.content.res.TypedArray.getLayoutDimension(TypedArray.java:491)
07-10 16:53:14.923: E/AndroidRuntime(394): at android.view.ViewGroup$LayoutParams.setBaseAttributes(ViewGroup.java:3592)
07-10 16:53:14.923: E/AndroidRuntime(394): at android.view.ViewGroup$MarginLayoutParams.<init>(ViewGroup.java:3672)
07-10 16:53:14.923: E/AndroidRuntime(394): at android.widget.FrameLayout$LayoutParams.<init>(FrameLayout.java:452)
07-10 16:53:14.923: E/AndroidRuntime(394): at android.widget.FrameLayout.generateLayoutParams(FrameLayout.java:418)
07-10 16:53:14.923: E/AndroidRuntime(394): at android.widget.FrameLayout.generateLayoutParams(FrameLayout.java:48)
07-10 16:53:14.923: E/AndroidRuntime(394): at android.view.LayoutInflater.rInflate(LayoutInflater.java:620)
07-10 16:53:14.923: E/AndroidRuntime(394): at android.view.LayoutInflater.rInflate(LayoutInflater.java:621)
07-10 16:53:14.923: E/AndroidRuntime(394): at android.view.LayoutInflater.inflate(LayoutInflater.java:407)
07-10 16:53:14.923: E/AndroidRuntime(394): at android.view.LayoutInflater.inflate(LayoutInflater.java:320)
07-10 16:53:14.923: E/AndroidRuntime(394): at android.view.LayoutInflater.inflate(LayoutInflater.java:276)
07-10 16:53:14.923: E/AndroidRuntime(394): at com.android.internal.policy.impl.PhoneWindow.setContentView(PhoneWindow.java:198)
07-10 16:53:14.923: E/AndroidRuntime(394): at android.app.Activity.setContentView(Activity.java:1647)
07-10 16:53:14.923: E/AndroidRuntime(394): at com.luochuang.programView.ProgramViewActivity.onCreate(ProgramViewActivity.java:20)
07-10 16:53:14.923: E/AndroidRuntime(394): at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1047)
07-10 16:53:14.923: E/AndroidRuntime(394): at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2627)
07-10 16:53:14.923: E/AndroidRuntime(394): ... 11 more
1.首先获取手机内存的两种方法:(ram,断电不可保存数据)
public String getAvailMemory() {
MemoryInfo outInfo = new MemoryInfo();
manager.getMemoryInfo(outInfo);
return Formatter.formatFileSize(ManagerTestActivity.this,
outInfo.availMem);
}
2.
public String getInternalAvailSize() {
StatFs mDataFileStats = new StatFs("/data");
long freeStorage = (long) mDataFileStats.getAvailableBlocks()
* mDataFileStats.getBlockSize();
return Formatter.formatFileSize(this, freeStorage);
}
获取sdcard卡的内存空间
// Sdcard的可用空间
public String getAvailSdSize() {
File path = Environment.getExternalStorageDirectory();
// StatFs:检索有关整体上的一个文件系统的空间信息
StatFs stat = new StatFs(path.getPath());
// 一个文件系统的块大小,以字节为单位。
long blockSize = stat.getBlockSize();
// SD卡中可用的块数
long availableBlocks = stat.getAvailableBlocks();
return Formatter.formatFileSize(this, blockSize * availableBlocks);
}
// Sdcard的总空间
public String getALLAvailSdSize() {
File path = Environment.getExternalStorageDirectory();
// StatFs:检索有关整体上的一个文件系统的空间信息
StatFs stat = new StatFs(path.getPath());
// 一个文件系统的块大小,以字节为单位。
long blockSize = stat.getBlockCount();
// SD卡中可用的块数
long availableBlocks = stat.getAvailableBlocks();
return Formatter.formatFileSize(this, blockSize * availableBlocks);
}