本文概述
你的Android设备上的RAM不仅存储Linux内核, 还存储来自所有已安装的应用程序, GPU等的其他类型的数据。设置中列出的可用RAM可能与你已安装的RAM总量不同设备。如果要在Android应用程序上显示此信息, 则需要根据要定位的Android版本弄乱不同的代码。
在本文中, 我们将向你展示如何在Android设备中使用Java检索设备的最大可用RAM大小。
A. Android API级别> = 16(JellyBean及更高版本)
如果你的应用程序仅针对Android API Level> = 16的设备, 则可以使用依赖于Android活动管理器的方法:
A.1。获取以字节为单位的RAM大小
以下方法返回RAM的最大可用大小(以字节为单位)。它返回一个长变量, 例如1567342592:
import android.content.Context;
import java.text.DecimalFormat;
import android.app.ActivityManager;
/**
* Returns the available ammount of RAM of your Android device in Bytes e.g 1567342592 (1.5GB)
* @return {Long}
*/
public long getMemorySizeInBytes()
{
Context context = getApplicationContext();
ActivityManager activityManager = (ActivityManager) context.getSystemService(Context.ACTIVITY_SERVICE);
ActivityManager.MemoryInfo memoryInfo = new ActivityManager.MemoryInfo();
activityManager.getMemoryInfo(memoryInfo);
long totalMemory = memoryInfo.totalMem;
return totalMemory;
}
A2。获取人类可读格式的RAM大小(Mb, Gb, Tb)
以下方法以人类可读的格式返回RAM的可用大小。它将返回一个字符串, 例如2GB, 1.5GB:
import android.content.Context;
import java.text.DecimalFormat;
import android.app.ActivityManager;
/**
* Returns the available ammount of RAM of your Android device in a human readable format e.g 1.56GB, 4GB, 512MB
*
* @return {String}
*/
public String getMemorySizeHumanized()
{
Context context = getApplicationContext();
ActivityManager activityManager = (ActivityManager) context.getSystemService(Context.ACTIVITY_SERVICE);
ActivityManager.MemoryInfo memoryInfo = new ActivityManager.MemoryInfo();
activityManager.getMemoryInfo(memoryInfo);
DecimalFormat twoDecimalForm = new DecimalFormat("#.##");
String finalValue = "";
long totalMemory = memoryInfo.totalMem;
double kb = totalMemory / 1024.0;
double mb = totalMemory / 1048576.0;
double gb = totalMemory / 1073741824.0;
double tb = totalMemory / 1099511627776.0;
if (tb > 1) {
finalValue = twoDecimalForm.format(tb).concat(" TB");
} else if (gb > 1) {
finalValue = twoDecimalForm.format(gb).concat(" GB");
} else if (mb > 1) {
finalValue = twoDecimalForm.format(mb).concat(" MB");
}else if(kb > 1){
finalValue = twoDecimalForm.format(mb).concat(" KB");
} else {
finalValue = twoDecimalForm.format(totalMemory).concat(" Bytes");
}
return finalValue;
}
B.任何Android API级别
如果你的代码需要在任何Android版本上运行, 则可以(如在每个基于Linux的系统中一样)通过/ proc / meminfo文件检索RAM的数量。系统使用/ proc / meminfo来报告系统上的可用内存和已使用内存(物理内存和交换内存)以及内核使用的共享内存和缓冲区的数量。
为了在Android上读取提到的文件, 请依靠Java的RandomAccessFile类读取文件。该文件包含类似于以下内容的结构:
因此, 你将需要处理文本以提取所需的内容, 在本例中, 我们将使用正则表达式进行处理并保持其简单性, 以下方法getMemorySizeHumanized返回一个具有人类可读大小的RAM的字符串, 例如2GB:
import android.content.Context;
import java.io.RandomAccessFile;
import java.text.DecimalFormat;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
import java.io.IOException;
/**
* Returns the available amount of RAM of your Android device in a human readable format e.g 1.56GB, 4GB, 512MB
*
* @return {String}
*/
public String getMemorySizeHumanized() {
RandomAccessFile reader;
String load;
DecimalFormat twoDecimalForm = new DecimalFormat("#.##");
double totRam;
String lastValue = "";
try {
reader = new RandomAccessFile("/proc/meminfo", "r");
load = reader.readLine();
Pattern p = Pattern.compile("(\\d+)");
Matcher m = p.matcher(load);
String value = "";
while (m.find()) {
value = m.group(1);
}
reader.close();
totRam = Double.parseDouble(value);
double mb = totRam / 1024.0;
double gb = totRam / 1048576.0;
double tb = totRam / 1073741824.0;
if (tb > 1) {
lastValue = twoDecimalForm.format(tb).concat(" TB");
} else if (gb > 1) {
lastValue = twoDecimalForm.format(gb).concat(" GB");
} else if (mb > 1) {
lastValue = twoDecimalForm.format(mb).concat(" MB");
} else {
lastValue = twoDecimalForm.format(totRam).concat(" KB");
}
} catch (IOException ex) {
ex.printStackTrace();
}
return lastValue;
}
编码愉快!