Android 怎样获得手机信息

标签: android 手机 信息 | 发表时间:2012-11-30 17:11 | 作者:awp258
出处:http://blog.csdn.net
Android 怎样获得手机信息

1.手机信息查看助手可行性分析

  开始进入编写程序前,需要对需求的功能做一些可行性分析,以做到有的放矢,如果有些无法实现的功能,可以尽快调整。
  这里分析一下项目需要的功能,主要是信息查看和信息收集,如版本信息、硬件信息等,这些都可以通过读取系统文件或者运行系统命令获取,而像获取安装的软件信息和运行时信息则需要通过API提供的接口获取。实现API接口不是什么问题,主要把精力集中在如何实现运行系统命令,获取其返回的结果功能实现上。具体实现代码如下所示:

public class CMDExecute { 
public synchronized String run(String [] cmd, String workdirectory) throws IOException { 
String result = ""; 
try { 
ProcessBuilder builder = new ProcessBuilder(cmd); 
InputStream in = null; 
//设置一个路径 
if (workdirectory != null) { 
builder.directory(new File(workdirectory)); 
builder.redirectErrorStream(true); 
Process process = builder.start(); 
in = process.getInputStream(); 
byte[] re = new byte[1024]; 

while (in.read(re) != -1) 
result = result + new String(re); 
} 
if (in != null) { 
in.close(); 
} 
} catch (Exception ex) { 
ex.printStackTrace(); 
} 
return result; 
} 
} 

1.2 手机信息查看助手功能实现
  1.2.1 手机信息查看助手主界面
  按照预设的规划,将4类信息的查看入口放在主界面上,其布局文件为main.xml,基本上是用一个列表组件组成的,实现代码如下所示:
  在这里main.xml中使用的是LinearLayout布局,其中放置了一个ListView组件。

< ?xml version="1.0" encoding="utf-8"?> 
< LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" 
android:/orientation="vertical" android:layout_width="fill_parent" 
android:layout_height="fill_parent"> 
< ListView 
android:layout_width="fill_parent" 
android:layout_height="fill_parent" 
android:id="@+id/itemlist" /> 
< /LinearLayout> 

  1.2.2 查看系统信息实现
 当在运行的主界面单击第一行时,也就是“系统信息”这一行,将执行代码如下:

case 0: 
intent.setClass(eoeInfosAssistant.this, System.class); 
startActivity(intent); 
break; 

代码运行后将显示系统(System)这个界面,这就是查看系统信息的主界面,其和主界面差不多,也就是列表显示几个需要查看的系统信息

   1.2.2.1 操作系统版本
  单击图界面第一行“操作系统版本”项,则会打开一个新的界面,其对应的是ShowInfo.java文件,然后需要显示该设备的操作系统版本信息,而这个信息在/proc/version中有,可以直接调用。在可行性分析中给出的CMDExencute类来调用系统的cat命令获取该文件的内容,实现代码如下:

Java代码:

public static String fetch_version_info() { 
String result = null; 
CMDExecute cmdexe = new CMDExecute(); 
try { 
String[ ] args = {"/system/bin/cat", "/proc/version"}; 
result = cmdexe.run(args, "system/bin/"); 
} catch (IOException ex) { 
ex.printStackTrace(); 
} 
return result; 
} 

上述代码使用的是CMDExecute类,调用系统的“"/system/bin/cat"”工具,获取“"/proc/version"”中内容。从图中显示的查寻结果可以看到,这个设备的系统版本是Linux version 2.6.25-018430-gfea26b0。
1.2.2.2 系统信息

在Android中,想要获取系统信息,可以调用其提供的方法System.getProperty(propertyStr),而系统信息诸如用户根目录(user.home)等都可以通过这个方法获取,实现代码如下:

Java代码:

public static StringBuffer buffer = null; 
private static String initProperty(String description,String propertyStr) { 
if (buffer == null) { 
buffer = new StringBuffer(); 
} 
buffer.append(description).append(":"); 
buffer.append (System.getProperty(propertyStr)).append(" "); 
return buffer.toString(); 
} 

private static String getSystemProperty() { 
buffer = new StringBuffer(); 
initProperty("java.vendor.url","java.vendor.url"); 
initProperty("java.class.path","java.class.path"); 
return buffer.toString(); 
} 

上述代码主要是通过调用系统提供的System.getProperty方法获取指定的系统信息,并合并成字符串返回。

   1.2.2.3 运营商信息

  运营商信息中包含IMEI、手机号码等,在Android中提供了运营商管理类(TelephonyManager),可以通过TelephonyManager来获取运营商相关的信息,实现的关键代码如下:

Java代码:

public static String fetch_tel_status(Context cx) { 
String result = null; 
TelephonyManager tm = (TelephonyManager) cx.getSystemService(Context.TELEPHONY_SERVICE); 
String str = " "; 
str += "DeviceId(IMEI) = " + tm.getDeviceId() + " "; 
str += "DeviceSoftwareVersion = " + tm.getDeviceSoftwareVersion()+" "; 
// TODO: Do something ... 
int mcc = cx.getResources().getConfiguration().mcc; 
int mnc = cx.getResources().getConfiguration().mnc; 
str +="IMSI MCC (Mobile Country Code): " +String.valueOf(mcc) + " "; 
str +="IMSI MNC (Mobile Network Code): " +String.valueOf(mnc) + " "; 
result = str; 
return result; 
} 

在上述的代码中,首先调用系统的getSystemService (Context.TELEPHONY_SERVICE)方法获取一个TelephonyManager对象tm,进而调用其方法 getDeviceId()获取DeviceId信息,调用getDeviceSoftware Version()获取设备的软件版本信息等。

1.2.3 查看硬件信息
  1.2.3.1 获取CPU信息

  可以在手机设备的/proc/cpuinfo中获取CPU信息,调用CMDEexecute执行系统的cat的命令,取/proc/cpuinfo的内容,显示的就是其CPU信息,实现代码如下:

Java代码:

public static String fetch_cpu_info() { 
String result = null; 
CMDExecute cmdexe = new CMDExecute(); 
try { 
String[ ] args = {"/system/bin/cat", "/proc/cpuinfo"}; 
result = cmdexe.run(args, "/system/bin/"); 
Log.i("result", "result=" + result); 
} catch (IOException ex) { 
ex.printStackTrace(); 
} 
return result; 
} 

上述代码使用CMDExecute,调用系统中的"/system/bin/cat"命令查看"/proc/cpuinfo"中的内容,即可得到CPU信息。
1.2.3.2 获取内存信息

  获取内存信息的方法和获取CPU信息的实现差不多,可以读取/proc/meminfo信息,另外还可以通过getSystemService(Context.ACTIVIT_SERV-
  ICE)获取ActivityManager.MemoryInfo对象,进而获取可用内存信息,主要代码如下:

Java代码:

按 Ctrl+C 复制代码
按 Ctrl+C 复制代码

上述代码中首先通过ActivityManager对象获取其可用的内存,然后通过查看“/proc/meminfo”内容获取更详细的信息。

   1.2.3.3 获取磁盘信息

  手机设备的磁盘信息可以通过df命令获取,所以,这里获取磁盘信息的方法和前面类似,惟一不同的是,这个是直接执行命令,获取其命令的返回就可以了,关键代码如下:

Java代码:

//磁盘信息 
public static String fetch_disk_info() { 
String result = null; 
CMDExecute cmdexe = new CMDExecute(); 
try { 
String[ ] args = {"/system/bin/df"}; 
result = cmdexe.run(args, "/system/bin/"); 
Log.i("result", "result=" + result); 
} catch (IOException ex) { 
ex.printStackTrace(); 
} 
return result; 
} 

1.2.3.4 获取网络信息

  要获取手机设备的网络信息,只要读取/system/bin/netcfg中的信息就可以了,关键代码如下:

Java代码:

public static String fetch_netcfg_info() { 
String result = null; 
CMDExecute cmdexe = new CMDExecute(); 
try { 
String[ ] args = {"/system/bin/netcfg"}; 
result = cmdexe.run(args, "/system/bin/"); 
} catch (IOException ex) { 
Log.i("fetch_process_info","ex=" + ex.toString()); 
} 
return result; 
} 

1.2.3.5获取显示屏信息

  除了显示手机的CPU、内存、磁盘信息外,还有个非常重要的硬件,显示屏。在Android中,它提供了DisplayMetrics类,可以通过getApplication Context()、getResources()、getDisplayMetrics()初始化,进而读取其屏幕宽(widthPixels)、高(heightPixels)等信息,实现的关键代码如下:

Java代码:

public static String getDisplayMetrics(Context cx) { 
String str = ""; 
DisplayMetrics dm = new DisplayMetrics(); 
dm = cx.getApplicationContext().getResources().getDisplayMetrics(); 
int screenWidth = dm.widthPixels; 
int screenHeight = dm.heightPixels; 
float density = dm.density; 
float xdpi = dm.xdpi; 
float ydpi = dm.ydpi; 
str += "The absolute width: " + String.valueOf(screenWidth) + "pixels "; 
str += "The absolute heightin: " + String.valueOf(screenHeight) + "pixels "; 
str += "The logical density of the display. : " + String.valueOf(density) + " "; 
str += "X dimension : " + String.valueOf(xdpi) +"pixels per inch "; 
str += "Y dimension : " + String.valueOf(ydpi) +"pixels per inch "; 
return str; 

} 

1.2.4 查看软件信息

  在Android上,可以在手机上随便安装自己喜欢的应用软件,查看软件信息的功能就是收集并显示已经安装的应用软件信息。Android 提供了getPackageManager()、getInstalledApplications(0)方法,可以直接返回全部已经安装的应用列表。这个功能就是只需要获取列表,再进行显示在列表中就可以了。但是,如果安装的软件比较多,那么获取信息所花费的时间会比较多,为了更好地完善用户使用的体验,在获取列表时,需要在界面提示用户耐心等待,这就需要用到Android提供的另外一个功能Runnable。

  引入Runnable比较简单,只需要在定义类的时候实现Runnable接口就可以了,所以,这里的软件信息查看界面对应的Software.java类声明代码如下:

Java代码:

public class Software extends Activity implements Runnable { 
}

然后需要在这个Activity启动的时候,引入进度条ProgressDialog来显示一个提示界面,onCreate代码如下所示:

Java代码:

public void onCreate(Bundle icicle) { 
Super.onCreate(icicle); 
setContentView(R.layout.softwares); 
setTitle("软件信息"); 
itemlist = (ListView) findViewById(R.id.itemlist); 
pd = ProgressDialog.show(this, "请稍候. .", "正在收集你已经安装的软件信息. . .", true, false); 
Thread thread = new Thread(this); 
thread.start(); 
} 

该方法创建了一个ProgressDialog,并设定其提示信息。然后实现其线程的run()方法,该方法实现其真正执行的逻辑,实现代码如下:

Java代码:

@Override 
Public void run() { 
fetch_installed_apps(); 
handler.sendEmptyMessage(0); 
} 

上述代码调用自定义的fetch_installed_app()方法获取已经安装的应用信息,这个方法是比较消耗时间的,实现代码如下:

Java代码:

public ArrayList fetch_installed_apps () { 
List< ApplicationInfo> packages = getPackageManager().getInstalledApplications(0); 
ArrayList< HashMap< String, Object>> list = new ArrayList< HashMap< String, Object>>(packages.size()); 
Iterator< ApplicationInfo> l = packages.iterator(); 
while (l.hasNext()) { 
HashMap< String, Object> map = new HashMap< String, Object>(); 
ApplicationInfo app = (ApplicationInfo) l.next(); 
String packageName = app.packageName; 
String label = " "; 
try { 
label = getPackageManager().getApplicationLabel(app).toString(); 
} catch (Exception e) { 
Log.i("Exception", e.toString() 
); 
} 
map = new HashMap< String, Object>(); 
map.put("name", label); 
map.put("desc", packageName); 
list.add(map); 
} 
return list; 
} 

上述代码使用getPackageManager().getInstalledApplications(0)获取已经安装的软件信息,进而构造用来显示的列表(List)对象,同时,界面通过进度条(ProgressDialog)显示提示信息。

  当这个方法运行完成后,会调用handler.sendEmptyMessage(0)语句给handler发送一个通知消息,使其执行下面的动作,下面就是这个handler的实现方法:

Java代码:

private Handler handler = new Handler() { 
public void handleMessage msg) { 
refreshListItems(); 
pd.dismiss(); 
}; 
} 

上述代码中,当其接收到run()线程传递的消失后,先调用refreshListItems()方法显示列表,最后调用进度条ProgressDialog的dismiss方法使其等待提示消失。而refreshListItems()的实现代码如下:

Java代码:

private void refreshListItems() { 
list = fetch_installed_apps(); 
SimpleAdapter notes = new SimpleAdater(this, list, R.layout.info_row,new String[] {"name", "desc"},new int[] {R.id.name, R.id.desc}); 
list.setAdapter(notes); 
setTitle("软件信息,已经安装" + list.size()+"款应用."); 
} 

这些代码,显示已经安装的应用列表的同时,在Title上显示一共安装了多少款应用.

1.2.5 获取运行时信息

  运行时的一些信息,包括后台运行的Service、Task,以及进程信息。

   1.2.5.1 获取正在运行的Service信息

  可以通过调用context.getSystemService(Context.ACTIVITY_SERVICE)获取 ActivityManager,进而通过系统提供的方法getRunningServices(int maxNum)获取正在运行的服务列表(RunningServiceInfo),再对其结果进一步分析,得到服务对应的进程名及其他信息,实现的关键代码如下:

Java代码:

//正在运行的服务列表 
public static String getRunningServicesInfo(Context context) { 
StringBuffer serviceInfo = new StringBuffer(); 
final ActivityManager activityManager = (ActivityManager) context.getSystemService(Context. ACTIVITY_SERVICE); 
List< RunningServiceInfo> services = activityManager.getRunningServices(100); 
Iterator< RunningServiceInfo> l = services.iterator(); 
while (l.hasNext()) { 
RunningServiceInfo si = (RunningServiceInfo) l.next(); 
serviceInfo.append("pid: ").append(si.pid); 
serviceInfo.append(" process: ").append(si. process); 
serviceInfo.append(" service: ").append(si. service); 
serviceInfo.append(" crashCount: ").append(si. crashCount); 
serviceInfo.append(" clicentCount: ").append(si.clientCount); 
serviceInfo.append(" activeSince:").append(ToolHelper.formatData(si.activeSince)); 
serviceInfo.append(" lastActivityTime: ").append(ToolHelper.formatData(si.lastActivityTime)); 
serviceInfo.append(" "); 
} 
return serviceInfo.toString(); 
} 

上述代码调用activityManager.getRunningServices(100)获取正在运行的服务,并依次遍历得到每个服务对应的pid,进程等信息.

   1.2.5.2 获取正在运行的Task信息

  获取正在运行的Task信息调用的是activityManager.getRunningTasks(int maxNum)来获取对应的正在运行的任务信息列表(RunningTaskInfo),进而分析、显示任务信息,其关键代码如下:

Java代码:

public static String getRunningTaskInfo(Context context) { 
StringBuffer sInfo = new StringBuffer(); 
final ActivityManager activityManager = (ActivityManager) context.getSystemService(Context. ACTIVITY_SERVICE); 
List< RunningTaskInfo> tasks = activityManager.getRunningTasks(100); 
Iterator< RunningTaskInfo> l = tasks.iterator(); 
while (l.hasNext()) { 
RunningTaskInfo ti = (RunningTaskInfo) l.next(); 
sInfo.append("id: ").append(ti.id); 
sInfo.append(" baseActivity: ").append(ti. baseActivity.flattenToString()); 
sInfo.append(" numActivities: ").append(ti. nnumActivities); 
sInfo.append(" numRunning: ").append(ti. numRunning); 
sInfo.append(" description: ").append(ti. description); 
sInfo.append(" "); 
} 
return sInfo.toString(); 
} 

上述代码调用系统提供的activityManager.getRunningTasks(100)方法获取任务列表,依次获取对应的id等信息,运行效果如图22。从图中显示可以看出,获取手机上正在运行的Task的列表和其对应的进程信息,这对用户了解设备运行情况非常有用。

   1.2.5.3 获取正在运行的进程信息

  该段程序是通过CMD Execute的方式来运行系统命令。关键代码如下:

Java代码:

public static String fetch_process_info() { 
Log.i("fetch_process_info","start. . . . "); 
String result = null; 
CMDExecutr cmdexe = new CMDExecute(); 
try { 
String [ ] args = {"/system/bin/top", "-n", "1"}; 
result = cmdexe.run(args, "/system/bin/"); 
} catch (IOException ex) { 
Log.i("fetch_process_info","ex=" + ex.toString()); 
} 
return result; 
} 

通过这个功能可以非常详细地了解到正在运行的进程和各个进程所消耗的资源情况。

   1.2.6 文件浏览器

  文件浏览器的这个功能,用户可以遍历浏览整个文件系统,以便更好地了解手机设备状况。在主界面单击最后一行将执行下列代码:

Java代码:

case 4: 
intent.setClass(eoeInfosAssistant.this, FSExplorer.class); 
startActivity(intent); 
break; 

对于如何进入子目录,并获取和显示其内部的文件夹和文件,也就是单击每行时响应的实现,代码如下:

Java代码:

@Override 
public void onItemClick(AdapterView< ?> parent, View v, int position, long id) { 
Log.i(TAG, "item clicked! [" + position + "]"); 
if (position == 0) { 
path = "/"; 
refreshListItems(path); 
}else if(position ==1) { 
goToParent(); 
} else { 
path = (String) list.get(position).get("path"); 
File file = new File(path); 
if (file.isDirectory()) 
refreshListItems(path); 
else 
Toast.makeText(FSExplorer.this,getString(R.string.is_file), Toast.LENGTH_SHORT).show(); 
} 
} 
作者:awp258 发表于2012-11-30 17:11:55 原文链接
阅读:0 评论:0 查看评论

相关 [android 手机 信息] 推荐:

Android 怎样获得手机信息

- - CSDN博客推荐文章
Android 怎样获得手机信息. 1.手机信息查看助手可行性分析.   开始进入编写程序前,需要对需求的功能做一些可行性分析,以做到有的放矢,如果有些无法实现的功能,可以尽快调整.   这里分析一下项目需要的功能,主要是信息查看和信息收集,如版本信息、硬件信息等,这些都可以通过读取系统文件或者运行系统命令获取,而像获取安装的软件信息和运行时信息则需要通过API提供的接口获取.

Google Android手机操作系统发展历程[信息图表]

- We_Get - 中文互联网数据研究资讯中心
2003年10月,Android公司在加州Palo Alto市成立,联合创始人为安迪-鲁宾、Rich Miner、Nick Sears与Chris White. 2005年8月,谷歌收购Android公司. 2007年11月5日,开放设备联盟(OHA)成立,12日Beta版的Android开发包发布.

美学者开发Android应用可通过手机震动窃取信息

- 静 - cnBeta.COM
美国加州大学的两名研究人员近日开发出了一种新型手机应用. 这款名为TouchLogger的Android应用,可以利用用户在按动手机屏幕键盘时产生的震动,记录下使用者的输入内容.

android GPS 获取城市信息

- - CSDN博客移动开发推荐文章
1、取得用户当前位置的经度,纬度. 取得用户当前位置的经度,纬度. 今天弄了一个多小时,写了一个GPS获取地理位置代码的小例子,包括参考了网上的一些代码,并且对代码进行了一些修改,希望对大家的帮助. 具体代码如下:  要实用Adnroid平台的GPS设备,首先需要添加上权限,所以需要添加如下权限:  .

【BlackHat 2017】国外研究员主题演讲:某中国公司仍在大量收集Android手机短信、联系人等信息

- - FreeBuf.COM | 关注黑客与极客
在周三的BlackHat黑帽大会上,来自上海的广升科技(Adups)再一次被推上风口浪尖. 研究人员称,广升在至少在两款Android手机中收集用户信息. 去年11月,Kryptowire安全公司的专家发布报告称,美国在售某些品牌的的Andriod手机的固件中存在广升公司的后门,广升为这些手机提供FOTA固件升级解决方案,从而在未经用户允许的情况下,将个人数据传输至其在上海的服务器,包括短信全文、联系人、通话记录等信息.

[Android实例] 利用Jsoup解析Html实现的Android招聘信息大全

- - CSDN博客推荐文章
看到很多招聘网站都没有推出招聘信息客户端,想来利用现成的资源,解析他们网站上提供招聘信息,这里就利用了Jsoup来解析HTML中的数据,实现整理归纳,然后显示的一个程序,也算是一个学习的程序吧,这里,我们先看一下图片,以下就程序源码. 源码下载: 点击打开链接. 作者:kangkangz4 发表于2011-12-13 11:09:34 原文链接.

获取手机应用信息

- - CSDN博客推荐文章
SystemUtils.java工具类. * 查询手机内所有应用包括系统应用. //判断是否为非系统预装的应用程序. * 查询手机内所有支持分享的应用. 通过 PackageInfo 获取具体信息方法:. 包名获取方法:packageInfo.packageName. icon获取获取方法:packageManager.getApplicationIcon(applicationInfo).

在Android手机上运行Ubuntu

- Alex Yu - Solidot
51开源社区 写道 "HTC Desire手机在经过简单的破解步骤后,已经可以相对稳定地运行以桌面应用为主的Linux操作系统Ubuntu. 破解方法是由一位论坛ID叫“Bergfex”的开发者发布的. 整个破解过程十分简便,仅需要在指定的文件夹——如SD卡的根目录和电脑的某个位置——中加载相应的zip文件,然后将手机设置成bootloader模式下加载,之后再将手机和电脑连接后重启即可.

HTC宣布将不锁定Android手机

- Ra白菜 - Solidot
HTC首席执行官周永明(Peter Chou)宣布,该公司未来的Android智能手机将不再锁定bootloader. HTC去年12月发布了Android 2.2 for Wildfire,更新了bootloader,不允许用户再修改固件. 由于HTC不太可能再发布新的更新,这意味着Wildfire用户无法获得新系统带来的新功能,或者安装新的自制固件,如CM7.

中国Android手机遭病毒攻击

- Benny Wen - Solidot
路透社报道,安全研究人员周四称,名为Geinimi的病毒正通过中国Android第三方应用商店传播,是第一种有类似僵尸网络功能的Android恶意程序. 安全公司Lookout Mobile Security估计,被该病毒感染的手机数量在数万到数十万部之间. 他们目前只在中国Android第三方应用商店中发现了含有该病毒的软件,而官方的Android电子市场似乎是安全的.