1、使用Build获取架构属性
下面我们来根据源码看看通过Build这个类可以得到哪些配置信息,具体就不解释了,从命名基本可以理解其代表的属性。

public class Build {    //当一个版本属性不知道时所设定的值。    public static final String UNKNOWN = "unknown";    //修订版本列表码    public static final String ID = getString("ro.build.id");    //显示屏参数    public static final String DISPLAY = getString("ro.build.display.id");    //整个产品的名称    public static final String PRODUCT = getString("ro.product.name");    //设备参数    public static final String DEVICE = getString("ro.product.device");    //主板    public static final String BOARD = getString("ro.product.board");    //cpu指令集    public static final String CPU_ABI = getString("ro.product.cpu.abi");    //cpu指令集2    public static final String CPU_ABI2 = getString("ro.product.cpu.abi2");    //硬件制造商    public static final String MANUFACTURER = getString("ro.product.manufacturer");    //系统定制商    public static final String BRAND = getString("ro.product.brand");    //版本即最终用户可见的名称    public static final String MODEL = getString("ro.product.model");    //系统启动程序版本号    public static final String BOOTLOADER = getString("ro.bootloader");    //硬件名称    public static final String HARDWARE = getString("ro.hardware");    //硬件序列号    public static final String SERIAL = getString("ro.serialno");    //build的类型    public static final String TYPE = getString("ro.build.type");    //描述build的标签,如未签名,debug等等。    public static final String TAGS = getString("ro.build.tags");    //唯一识别码    public static final String FINGERPRINT = getString("ro.build.fingerprint");    public static final long TIME = getLong("ro.build.date.utc") * 1000;    public static final String USER = getString("ro.build.user");    public static final String HOST = getString("ro.build.host");    //获取无线电固件版本    public static String getRadioVersion() {        return SystemProperties.get(TelephonyProperties.PROPERTY_BASEBAND_VERSION, null);    }    private static String getString(String property) {        return SystemProperties.get(property, UNKNOWN);    }    private static long getLong(String property) {        try {            return Long.parseLong(SystemProperties.get(property));        } catch (NumberFormatException e) {            return -1;        }    }  //各种版本字符串    public static class VERSION {        public static final String INCREMENTAL = getString("ro.build.version.incremental");        public static final String RELEASE = getString("ro.build.version.release");        public static final int SDK_INT = SystemProperties.getInt(                "ro.build.version.sdk", 0);        public static final String CODENAME = getString("ro.build.version.codename");    }    //目前已知的版本代码的枚举类    public static class VERSION_CODES {        public static final int CUR_DEVELOPMENT = 10000;        /** * October 2008: The original, first, version of Android. Yay! */        public static final int BASE = 1;        /** * February 2009: First Android update, officially called 1.1. */        public static final int BASE_1_1 = 2;        /** * May 2009: Android 1.5. */        public static final int CUPCAKE = 3;        /** * September 2009: Android 1.6. */        public static final int DONUT = 4;        /** * November 2009: Android 2.0 */        public static final int ECLAIR = 5;        /** * December 2009: Android 2.0.1 */        public static final int ECLAIR_0_1 = 6;        /** * January 2010: Android 2.1 */        public static final int ECLAIR_MR1 = 7;        /** * June 2010: Android 2.2 */        public static final int FROYO = 8;        /** * November 2010: Android 2.3 */        public static final int GINGERBREAD = 9;        /** * February 2011: Android 2.3.3. */        public static final int GINGERBREAD_MR1 = 10;        /** * February 2011: Android 3.0. */        public static final int HONEYCOMB = 11;        /** * May 2011: Android 3.1. */        public static final int HONEYCOMB_MR1 = 12;        /** * June 2011: Android 3.2. */        public static final int HONEYCOMB_MR2 = 13;        /** * October 2011: Android 4.0. */        public static final int ICE_CREAM_SANDWICH = 14;        /** * December 2011: Android 4.0.3. */        public static final int ICE_CREAM_SANDWICH_MR1 = 15;        /** * June 2012: Android 4.1. */        public static final int JELLY_BEAN = 16;        /** * Android 4.2: Moar jelly beans! */        public static final int JELLY_BEAN_MR1 = 17;        /** * Android 4.3: Jelly Bean MR2, the revenge of the beans. */        public static final int JELLY_BEAN_MR2 = 18;        /** * Android 4.4: KitKat, another tasty treat. */        public static final int KITKAT = 19;    }}

下面举个例子:

/** * 获取设备信息 * * @return */private String getDeviceInfo() {  StringBuffer sb = new StringBuffer();  sb.append(主板: + Build.BOARD);  sb.append(系统启动程序版本号: + Build.BOOTLOADER);  sb.append(系统定制商: + Build.BRAND);  sb.append(cpu指令集: + Build.CPU_ABI);  sb.append(cpu指令集2 + Build.CPU_ABI2);  sb.append(设置参数: + Build.DEVICE);  sb.append(显示屏参数: + Build.DISPLAY);  sb.append(www.2cto.com无线电固件版本: + Build.getRadioVersion());  sb.append(硬件识别码: + Build.FINGERPRINT);  sb.append(硬件名称: + Build.HARDWARE);  sb.append(HOST: + Build.HOST);  sb.append(修订版本列表: + Build.ID);  sb.append(硬件制造商: + Build.MANUFACTURER);  sb.append(版本: + Build.MODEL);  sb.append(硬件序列号: + Build.SERIAL);  sb.append(手机制造商: + Build.PRODUCT);  sb.append(描述Build的标签: + Build.TAGS);  sb.append(TIME: + Build.TIME);  sb.append(builder类型: + Build.TYPE);  sb.append(USER: + Build.USER);  return sb.toString();}

2、ActivityManager获取内存信息

在ActivityManager里面有个getMemoryInfo函数,可以获取到内存信息。

public void getMemoryInfo(MemoryInfo outInfo) {    try {        ActivityManagerNative.getDefault().getMemoryInfo(outInfo);    } catch (RemoteException e) {    }}

下面我们来看看MemoryInfo这个类:

public static class MemoryInfo implements Parcelable {    public long availMem;    public long totalMem;    public long threshold;    public boolean lowMemory;    public MemoryInfo() {    }    public int describeContents() {        return 0;    }    public void writeToParcel(Parcel dest, int flags) {        dest.writeLong(availMem);        dest.writeLong(totalMem);        dest.writeLong(threshold);        dest.writeInt(lowMemory ? 1 : 0);        dest.writeLong(hiddenAppThreshold);        dest.writeLong(secondaryServerThreshold);        dest.writeLong(visibleAppThreshold);        dest.writeLong(foregroundAppThreshold);    }    public void readFromParcel(Parcel source) {        availMem = source.readLong();        totalMem = source.readLong();        threshold = source.readLong();        lowMemory = source.readInt() != 0;        hiddenAppThreshold = source.readLong();        secondaryServerThreshold = source.readLong();        visibleAppThreshold = source.readLong();        foregroundAppThreshold = source.readLong();    }    public static final Creator<MemoryInfo> CREATOR            = new Creator<MemoryInfo>() {        public MemoryInfo createFromParcel(Parcel source) {            return new MemoryInfo(source);        }        public MemoryInfo[] newArray(int size) {            return new MemoryInfo[size];        }    };    private MemoryInfo(Parcel source) {        readFromParcel(source);    }}

另外,需要说明的是,我们可以直接读取系统的一个文件来获取内存信息。这个文件目录为:/proc/meminfo
如下图:

3、获取SDCard存储

/** * 获得SD卡总大小 * * @return */  private String getSDTotalSize() {      File path = Environment.getExternalStorageDirectory();      StatFs stat = new StatFs(path.getPath());      long blockSize = stat.getBlockSize();      long totalBlocks = stat.getBlockCount();      return Formatter.formatFileSize(MainActivity.this, blockSize * totalBlocks);  }  /** * 获得sd卡剩余容量,即可用大小 * * @return */  private String getSDAvailableSize() {      File path = Environment.getExternalStorageDirectory();      StatFs stat = new StatFs(path.getPath());      long blockSize = stat.getBlockSize();      long availableBlocks = stat.getAvailableBlocks();      return Formatter.formatFileSize(MainActivity.this, blockSize * availableBlocks);  }  /** * 获得机身内存总大小 * * @return */  private String getRomTotalSize() {      File path = Environment.getDataDirectory();      StatFs stat = new StatFs(path.getPath());      long blockSize = stat.getBlockSize();      long totalBlocks = stat.getBlockCount();      return Formatter.formatFileSize(MainActivity.this, blockSize * totalBlocks);  }  /** * 获得机身可用内存 * * @return */  private String getRomAvailableSize() {      File path = Environment.getDataDirectory();      StatFs stat = new StatFs(path.getPath());      long blockSize = stat.getBlockSize();      long availableBlocks = stat.getAvailableBlocks();      return Formatter.formatFileSize(MainActivity.this, blockSize * availableBlocks);  } 

另外,我们可以通过StorageManager来获取其他的信息,但需要注意的是有些方法需要使用反射来调用,因为它们是不可见的。

4、读取CPU信息

我们可以读取系统目录下/proc/cpuinfo的文件来获取CPU信息。如下图所示,事实上,我们可以查看/proc目录的所有文件,来查看各种信息。

/proc/cmdline:显示内核启动的命令行。/proc/cpuinfo:显示系统cpu的信息。/proc/filesystems,显示当前注册了的文件系统列表,nodev表示为虚拟文件系统。/proc/interrupts:显示当前系统的中断信息./proc/ioports:被占用的输入/输出地址范围列表。/proc/kmsg:输出内核消息日志。/proc/loadavg:监控cpu平均负载,其数值为所有核上cpu占用的累加值,前三个分别表示最近1515分钟的平均负载,第四个表示当前运行进程数和进程总数,最后一个表示最近运行的进程id。/proc/locks:打开文件上的加锁信息。/proc/meminfo:显示物理及虚拟内存使用情况。/proc/misc:内核函数misc_register登记的设备驱动程序。/proc/modules:加载的内核模块列表。/proc/mounts:当前系统所安装的文件系统信息(包括手动安装的)。/proc/stat:系统简要信息。/proc/uptime:分别表示系统启动时间和系统空闲时间。/proc/version:系统内核版本。/proc/net:其实际挂载点是/proc/self/net,能够显示当前各种网络情况,例如通过tcp文件可以查看tcp连接数及连接情况。/proc/sys 报告各种不同的内核参数,某些参数能在root的情况下进行修改。/proc/devices 当前挂载的所有软硬件设备(字符设备和块设备),包括主设备号和设备名称。/proc/asound:声卡相关的信息。/proc/buddyinfo:每个内存区中每个order有多少块可用,和内存碎片问题有关。/proc/bus:输入设备信息。/proc/cgroups:查看cgroups子系统信息。/proc/diskstats:用于显示磁盘、分区和统计信息。/proc/execdomains:安全相关的信息。/proc/fb:帧缓冲设备信息。/proc/iomem:记录物理地址的分配情况。/proc/kallsyms:内核符号表信息。/proc/pagetypeinfo:内存分页信息。/proc/partitions:分区信息/proc/sched_debug:cpu调度信息。/proc/softirqs:软中断情况。/proc/vmallocinfo:vmalloc内存分配信息。/proc/vmstat:统计虚拟内存信息。/proc/pid:显示进城相关的所有信息。

5、获取电池电量信息

获取到电池信息一般可以通过两个类获取:android.content.BroadcastReceiver类和android.os.BatteryManager类

在BroadcastReceiver的onReceive()事件,接收到的Intent.ACTION_BATTERY_CHANGED,包括下面的信息:

“status”(int类型)…状态,定义值是BatteryManager.BATTERY_STATUS_XXX。“health”(int类型)…健康,定义值是BatteryManager.BATTERY_HEALTH_XXX。“present”(boolean类型)“level”(int类型)…电池剩余容量“scale”(int类型)…电池最大值。通常为100。“icon-small”(int类型)…图标ID。“plugged”(int类型)…连接的电源插座,定义值是BatteryManager.BATTERY_PLUGGED_XXX。“voltage”(int类型)…mV。“temperature”(int类型)…温度,0.1度单位。例如 表示197的时候,意思为19.7度。“technology”(String类型)…电池类型,例如,Li-ion等等。
public class BatteryTestActivity extends Activity {     /** Called when the activity is first created. */     @Override     public void onCreate(Bundle savedInstanceState) {         super.onCreate(savedInstanceState);         setContentView(R.layout.main);             }     @Override     protected void onResume() {         super.onResume();         IntentFilter filter = new IntentFilter();         filter.addAction(Intent.ACTION_BATTERY_CHANGED);         registerReceiver(mBroadcastReceiver, filter);     }     @Override     protected void onPause() {         super.onPause();         unregisterReceiver(mBroadcastReceiver);     }     private BroadcastReceiver mBroadcastReceiver = new BroadcastReceiver() {         @Override         public void onReceive(Context context, Intent intent) {             String action = intent.getAction();             if (action.equals(Intent.ACTION_BATTERY_CHANGED)) {                 int status = intent.getIntExtra("status", 0);                 int health = intent.getIntExtra("health", 0);                 boolean present = intent.getBooleanExtra("present", false);                 int level = intent.getIntExtra("level", 0);                 int scale = intent.getIntExtra("scale", 0);                 int icon_small = intent.getIntExtra("icon-small", 0);                 int plugged = intent.getIntExtra("plugged", 0);                 int voltage = intent.getIntExtra("voltage", 0);                 int temperature = intent.getIntExtra("temperature", 0);                 String technology = intent.getStringExtra("technology");                 String statusString = "";                 switch (status) {                 case BatteryManager.BATTERY_STATUS_UNKNOWN:                     statusString = "unknown";                     break;                 case BatteryManager.BATTERY_STATUS_CHARGING:                     statusString = "charging";                     break;                 case BatteryManager.BATTERY_STATUS_DISCHARGING:                     statusString = "discharging";                     break;                 case BatteryManager.BATTERY_STATUS_NOT_CHARGING:                     statusString = "not charging";                     break;                 case BatteryManager.BATTERY_STATUS_FULL:                     statusString = "full";                     break;                 }                 String healthString = "";                 switch (health) {                 case BatteryManager.BATTERY_HEALTH_UNKNOWN:                     healthString = "unknown";                     break;                 case BatteryManager.BATTERY_HEALTH_GOOD:                     healthString = "good";                     break;                 case BatteryManager.BATTERY_HEALTH_OVERHEAT:                     healthString = "overheat";                     break;                 case BatteryManager.BATTERY_HEALTH_DEAD:                     healthString = "dead";                     break;                 case BatteryManager.BATTERY_HEALTH_OVER_VOLTAGE:                     healthString = "voltage";                     break;                 case BatteryManager.BATTERY_HEALTH_UNSPECIFIED_FAILURE:                     healthString = "unspecified failure";                     break;                 }                 String acString = "";                 switch (plugged) {                 case BatteryManager.BATTERY_PLUGGED_AC:                     acString = "plugged ac";                     break;                 case BatteryManager.BATTERY_PLUGGED_USB:                     acString = "plugged usb";                     break;                 }                 Log.v("status", statusString);                 Log.v("health", healthString);                 Log.v("present", String.valueOf(present));                 Log.v("level", String.valueOf(level));                 Log.v("scale", String.valueOf(scale));                 Log.v("icon_small", String.valueOf(icon_small));                 Log.v("plugged", acString);                 Log.v("voltage", String.valueOf(voltage));                 Log.v("temperature", String.valueOf(temperature));                 Log.v("technology", technology);             }         }     }; }

应用程序为了取得电池的状态,通常的做法是监听ACTION_BATTERY_CHANGED这个intent,只能在收到这个intent的时候才能取得电池的状态信息,有没有同步取得电池信息的办法呢?

实际上,系统driver维护着保存电池信息的一组文件。

/sys/class/power_supply/ac/online AC电源连接状态/sys/class/power_supply/usb/online USB电源连接状态/sys/class/power_supply/battery/status 充电状态/sys/class/power_supply/battery/health 电池状态/sys/class/power_supply/battery/present 使用状态/sys/class/power_supply/battery/capacity 电池level/sys/class/power_supply/battery/batt_vol 电池电压/sys/class/power_supply/battery/batt_temp 电池温度/sys/class/power_supply/battery/technology 电池技术

当电池状态发生变化时,driver会更新这些文件,因此在应用程序中通过读取这些文件的办法,可以做到同步取得电池信息。

6、获取手机各种状态信息

TelephonyManager tm = (TelephonyManager) this.getSystemService(TELEPHONY_SERVICE); /*    * 电话状态:    * 1.tm.CALL_STATE_IDLE=0          无活动    * 2.tm.CALL_STATE_RINGING=1  响铃    * 3.tm.CALL_STATE_OFFHOOK=2  摘机    */ tm.getCallState();//int /*    * 电话方位:    * */ tm.getCellLocation();//CellLocation /*    * 唯一的设备ID:    * GSM手机的 IMEI 和 CDMA手机的 MEID.     * Return null if device ID is not available.    */ tm.getDeviceId();//String /*    * 设备的软件版本号:    * 例如:the IMEI/SV(software version) for GSM phones.    * Return null if the software version is not available.     */ tm.getDeviceSoftwareVersion();//String /*    * 手机号:    * GSM手机的 MSISDN.    * Return null if it is unavailable.     */ tm.getLine1Number();//String /*    * 附近的电话的信息:    * 类型:List<NeighboringCellInfo>     * 需要权限:android.Manifest.permission#ACCESS_COARSE_UPDATES    */ tm.getNeighboringCellInfo();//List<NeighboringCellInfo> /*    * 获取ISO标准的国家码,即国际长途区号。    * 注意:仅当用户已在网络注册后有效。    * 在CDMA网络中结果也许不可靠。    */ tm.getNetworkCountryIso();//String /*    * MCC+MNC(mobile country code + mobile network code)    * 注意:仅当用户已在网络注册时有效。    * 在CDMA网络中结果也许不可靠。    */ tm.getNetworkOperator();//String /*    * 按照字母次序的current registered operator(当前已注册的用户)的名字    * 注意:仅当用户已在网络注册时有效。    * 在CDMA网络中结果也许不可靠。    */ tm.getNetworkOperatorName();//String /*    * 当前使用的网络类型:    * 例如: NETWORK_TYPE_UNKNOWN  网络类型未知  0    NETWORK_TYPE_GPRS     GPRS网络  1    NETWORK_TYPE_EDGE     EDGE网络  2    NETWORK_TYPE_UMTS     UMTS网络  3    NETWORK_TYPE_HSDPA    HSDPA网络  8     NETWORK_TYPE_HSUPA    HSUPA网络  9    NETWORK_TYPE_HSPA     HSPA网络  10    NETWORK_TYPE_CDMA     CDMA网络,IS95A 或 IS95B.  4    NETWORK_TYPE_EVDO_0 EVDO网络, revision 0. 5 NETWORK_TYPE_EVDO_A   EVDO网络, revision A.  6    NETWORK_TYPE_1xRTT    1xRTT网络  7    */ tm.getNetworkType();//int /*    * 手机类型:    * 例如: PHONE_TYPE_NONE  无信号    PHONE_TYPE_GSM   GSM信号    PHONE_TYPE_CDMA  CDMA信号    */ tm.getPhoneType();//int /*    * Returns the ISO country code equivalent for the SIM provider's country code.    * 获取ISO国家码,相当于提供SIM卡的国家码。    * */ tm.getSimCountryIso();//String /*    * Returns the MCC+MNC (mobile country code + mobile network code) of the provider of the SIM. 5 or 6 decimal digits.    * 获取SIM卡提供的移动国家码和移动网络码.5或6位的十进制数字.    * SIM卡的状态必须是 SIM_STATE_READY(使用getSimState()判断).    */ tm.getSimOperator();//String /*    * 服务商名称:    * 例如:中国移动、联通    * SIM卡的状态必须是 SIM_STATE_READY(使用getSimState()判断).    */ tm.getSimOperatorName();//String /*    * SIM卡的序列号:    * 需要权限:READ_PHONE_STATE    */ tm.getSimSerialNumber();//String /*    * SIM的状态信息:    * SIM_STATE_UNKNOWN          未知状态 0    SIM_STATE_ABSENT           没插卡 1    SIM_STATE_PIN_REQUIRED 锁定状态,需要用户的PIN码解锁 2 SIM_STATE_PUK_REQUIRED     锁定状态,需要用户的PUK码解锁 3    SIM_STATE_NETWORK_LOCKED 锁定状态,需要网络的PIN码解锁 4 SIM_STATE_READY 就绪状态 5 */ tm.getSimState();//int /*    * 唯一的用户ID:    * 例如:IMSI(国际移动用户识别码) for a GSM phone.    * 需要权限:READ_PHONE_STATE    */ tm.getSubscriberId();//String /*    * 取得和语音邮件相关的标签,即为识别符    * 需要权限:READ_PHONE_STATE    */ tm.getVoiceMailAlphaTag();//String /*    * 获取语音邮件号码:    * 需要权限:READ_PHONE_STATE    */ tm.getVoiceMailNumber();//String /*    * ICC卡是否存在    */ tm.hasIccCard();//boolean /*    * 是否漫游:    * (在GSM用途下)    */ tm.isNetworkRoaming();// 

值得注意的是,这个需要android.permission.READ_PHONE_STATE权限。

6、获取流量信息

有两种方法,一种是使用TrafficStats类,另一种就是读取系统流量文件:/proc/net/xt_qtaguid/stats

关于第一种方法:参考文章:Android中TrafficStats流量监控类

参考文章:
获取Android手机各种状态信息

Android 获取系统 cpu 信息,内存,版本,电量等信息

Android系统/proc目录详解

Android获取SD卡总容量,可用大小,机身内存总容量及可用大小的系统方法

Android Low Memory Killer

更多相关文章

  1. android httpclient 302自动跳转
  2. android 获取手机内存大小
  3. Android使用Fragment来实现ViewPager的功能(解决切换Fragment状态
  4. Android使用ListView构造复杂界面,响应点击事件,通过Intent跳转act
  5. Android利用Jsoup解析实现简单新闻客户端
  6. Android(安卓)获取view在屏幕中的位置
  7. java获取系统语言(区分简体中文和繁体中文) .
  8. [置顶] activity配置信息详解
  9. Android使用Fragment来实现TabHost的功能(解决切换Fragment状态不

随机推荐

  1. 【Android 开发】: Android客户端与服务
  2. [转]暑期大学生博客分享大赛 - 2011 Andr
  3. Android多线程AsyncTask详解
  4. android studio 模拟器闪退问题
  5. Android上替代SQLite的选择:Realm
  6. 只会写xml和Activity,做android真的不行!
  7. Android(安卓)TabLayout添加自定义分割线
  8. Android之Android的数据存储--SD卡
  9. [006] 百度地图移动版API终于发布了(Andr
  10. Android(安卓)SimpleAdapter显示ListView