2011年05月19日
1.手机信息查看助手可行性分析
开始进入编写程序前,需要对需求的功效做一些可行性分析,以做到有的放矢,如果有些无法使成为事实的功效,可以尽快调整。
这搭分析一下项目需要的功效,主如果信息查看和信息收集,如版本信息、硬件信息等,这些个都可以通过读取体系文件或运行体系命令获取,而像获取安装的软件信息和运行时信息则需要通过API供给的接口获取。使成为事实API接口不是什么疑难题目,主要把精力集中在怎样使成为事实运行体系命令,获取其返回的成果功效使成为事实上。具体使成为事实代码如下所示:
public class CMDExecute {
public synchronized String run ( String [] cmd,String workdirectory)
throws IOException {
String result = “ ” ;
try {
processBuilder builder = new ProcessBuilder ( cmd );
//配置1个路径
if ( workdirectory ! = null )
builder.directory ( new File ( workdirectory ) ) ;
builder.redirectErrorStream (true) ;
Process process = builder.start ( ) ;
InputStream in = process.getInputStream ( ) ;
byte[] re = new byte[1024] ;
while ( in.read ( re ) ) ;
result = result + new String ( re ) ;
}
in.close ( ) ;
} catch ( Exception ex ) {
Ex.printStackTrace ( ) ;
}
Return result ;
}
}
1.2手机信息查看助手功效使成为事实
1.2.1手机信息查看助手主界面
按照预设的规划,将4类信息的查看入口放在主界面上,其布局文件为mail.xml,基本上是用1个列表组件构成的,使成为事实代码如下所示:
android=”http://schemas.android.com/apk/res/android”
android:/orientation=”vertical” android:layout_width=”fill_parent”
android:layout_height=”fill_parent”>
android:layout_width=”fill_parent”
android:layout_height=”fill_parent”
android:id=”@+id/itemlist” />
在这搭mail.xml中使用的是LinearLayout布局,其中放置了1个ListView组件。
1.2.2查看体系信息使成为事实
当在运行的主界面裸机熬头行时,也就是“体系信息”这一行,将执行代码如下:
case 0;
intent.setClass(eoeInfosAssistant.this, System.class);
startActivity(intent);
break;
代码运行后将显示体系(System)这个界面,这就是查看体系信息的主界面,其和主界面差不离,也就是列表显示几个需要查看的体系信息,
1.2.2.1操作体系版本
裸机图9所示的界面熬头行“操作体系版本”项,则会打开1个新的界面,其对应的是ShowInfo.java文件,然后需要显示该装备的操作体系版本信息,而这个信息在/proc/version中有,可以直接调用。在可行性分析中给出的CMDExencute类来调用体系的cat命令获取该文件的内容,使成为事实代码如下:
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””中内容。其运行效果如图9。从图中显示的查寻成果可以看到,这个装备的体系版本是Linux version 2.6.25-018430-gfea26b0。
1.2.2.2体系信息
在Android中,想要获取体系信息,可以调用其供给的要领System.getProperty(propertyStr),而体系信息诸如用户根目录(user.home)等都可以通过这个要领获取,使成为事实代码如下:
private static String initProperty(String description,String propertyStr) {
if (buffer == null) {
buffer = new StringBuffer();
}
buffer.append(description).append(”:”);
buffer.append (System.getProperty(propertyStr)).append(”\n”);
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来获取运营商相关的信息,使成为事实的要害代码如下:
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.getDetDeviceId() + “\n”;
str += “DeviceSoftwareVersion = ” + tm.getDeviceSoftwareVersion()+”\n”;
. . .
int mcc = cx.getResources().getConfiguration().mcc;
int mcc = cx.getResources().getConfiguration().mcc;
str +=”IMSI MCC (Mobile Country Code): ” +String.valueOf(mcc) + “\n”;
str +=”IMSI MCC (Mobile Country Code): ” +String.valueOf(mnc) + “\n”;
result = str;
return result;
}
在上述的代码中,首先调用体系的getSystemService (Context.TELEPHONY_SERVICE)要领获取1个TelephonyManager对象tm,继续往前调用其要领getDeviceId()获取DeviceId信息,调用getDeviceSoftware Version()获取装备的软件版本信息等。
1.2.3查看硬件信息
1.2.3.1获取CPU信息
可以在握机装备的/proc/cpuinfo中获取CPU信息,调用CMDEexecute执行体系的cat的命令,读取/proc/cpuinfo的内容,显示的就是其CPU信息,使成为事实代码如下:
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对象,继续往前获取可用内存信息,主要代码如下:
/**
*体系内存情况查看
*/
public static String getMemoryInfo(Context context) {
StringBuffer memoryInfo = new StringBuffer();
final ActivityManager activityManager = (AcctivityManager) context
.getSystemService(Context.ACTIVITY_SERVICE);
ActivityManager. MemoryInfo outInfo = new ActivityManager. MemoryInfo();
activityManager.getMemoryInfo(outInfo);
memoryInfo.append(”\nTotal Available Memory :”).append(
outInfo.availMem >> 10).append(”k”);
memoryInfo.append(”\nTotal Available Memory :”).append(
outInfo.availMem >> 20).append(”k”);
memoryInfo.append(”\nIn low memory situation:”).append(
outInfo. Lowmemory);
String result = null;
CMDExecute cmdexe = new CMDExecute();
try {
String[ ] args = { “/system/bin/cat”, “/proc/meminfo” };
result = cmdexe.run(args, “/system/bin/”);
} catch (IOException ex) {
Log.i(”fetch_process_info”,”ex=” + ex.toString());
}
Return memoryInfo.toString()+”\n\n”+result;
}
上述代码中首先通过ActivityManager对象获取其可用的内存,然后通过查看“/proc/meminfo”内容获取更详细的信息。
1.2.3.3获取磁盘信息
手机装备的磁盘信息可以通过df命令获取,所以,这搭获取磁盘信息的要领和前面近似,惟一差别的是,这个是直接执行命令,获取其命令的返回就可以了,要害代码如下:
//磁盘信息
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中的信息就可以了,要害代码如下:
public static String fetch_netcfg_info() {
String result = null;
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)等信息,使成为事实的要害代码如下:
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\n”;
str += “The absolute heightin: ” + String.valueOf(screenHeight) + “pixels\n”;
str += “The logical density of the display. : ” + String.valueOf(density) + “\n”;
str += “X dimension : ” + String.valueOf(xdpi) +”pixels per inch\n”;
str += “Y dimension : ” + String.valueOf(ydpi) +”pixels per inch\n”;
renturn str;
}
1.2.4查看软件信息
在Android上,可以在握机上轻率安装自己喜欢的应用软件,查看软件信息的功效就是收集并显示已经安装的应用软件信息。
在Android中,它供给了getPackageManager()、getInstalledApplications(0)要领,可以直接返回全数已经安装的应用列表。这个功效就是只需要获取列表,再进行显示在列表中就可以了。可是,如果安装的软件比力多,那么获守信息所花费的时间会比力多,为了更好地完善用户使用的体验认识,在获取列表时,需要在界面提示用户耐烦等候,这就需要用到Android供给的别的1个功效Runnable。
引入Runnable比力简略,只需要在定义类的时候使成为事实Runnable接口就可以了,所以,这搭的软件信息查看界面对应的Software.java类声明代码如下:
public class Software extends Activity implements Runnable {
. . .
}
然后需要在这个Activity开始工作的时候,引入进度条ProgressDialog来显示1个提示界面,onCreate代码如下所示:
Public void onCreate(Bundle icicle) {
Super.onCreate(icicle);
setContentView(R.layout.softwares);
setTitle(”软件信息”)
itemlist = (ListView) findViewById(R.id.itemlist);
pd = ProgressDialog.show(this, “请稍候. .”, “正在收集你已经安装的软件信息. . .”, true,flase);
Thread thread = new Thread(this);
Thread.start();
}
该要领创建了1个ProgressDialog,并设定其提示信息。然后使成为事实其线程的run()要领,该要领使成为事实其真正执行的逻辑,使成为事实代码如下:
@Override
Public void run() {
fetch_installed_apps();
handler.sendEmptyMessage(0);
}
上述代码调用自定义的fetch_installed_app()要领获取已经安装的应用信息,这个要领是比力耗损时间的,使成为事实代码如下:
public List fetch_installed_apps () {
List packages = getPackageManager().getInstalledApplications(0);
list = new ArrayList>(
packages.size());
Iterator l = packages.iterator();
while (l.hasNext()) {
Map map = new HashMap();
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();
map.put(”name”, label);
map.put(”desc”, packageName);
list.add(map);
}
Return list;
}
上述代码使用getPackageManager().getInstalledApplications(0)获取已经安装的软件信息,继续往前机关用来显示的列表(List)对象,同时,界面通过进度条(ProgressDialog)显示提示信息,运行效果如图18所示。
当这个要领运行完成后,会调用handler.sendEmptyMessage(0)语句给handler送出1个通知动静,使其执行下面的动作,下面就是这个handler的使成为事实要领:
private Handler handler = new Handler() {
public void handleMessage msg) {
refreshListItems();
pd.dismiss();
};}
上述代码中,当其接收到run()线程传递的消失后,先调用refreshListItems()要领显示列表,最后调用进度条ProgressDialog的dismiss要领使其等候提示消失。而refreshListItems()的使成为事实代码如下:
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 });
Itemlist.setAdapter(notes);
setTitle(”软件信息,已经安装”+list.size()+”款应用.”);
}
这些个代码,显示已经安装的应用列表的同时,在Title上显示一共安装了几多款应用
1.2.5获取运行时信息
运行时的一些信息,包孕后台运行的Service、Task,以及进程信息,其运行界面如图20。
1.2.5.1获取正在运行的Service信息
可以通过调用context.getSystemService(Context.ACTIVITY_SERVICE)获取ActivityManager,继续往前通过体系供给的要领getRunningServices(int maxNum)获取正在运行的服务列表(RunningServiceInfo),再对其成果进一步分析,得到服务对应的进程名及其他信息,使成为事实的要害代码如下:
//正在运行的服务列表
public static String getRunningServicesInfo(Context context) {
StringBuffer serviceInfo = new StringBuffer();
final ActivityManager activityManager = (ActivityManager) context
.getSystemService(Context. ACTIVITY_SERVICE);
List services = activityManager.getRunningServices(100);
Iterator l = services.iterator();
while (l.hasNext()) {
RunningServiceInfo si = (RunningServiceInfo) l.next();
serviceInfo.append(”pid: “).append(si.pid);
serviceInfo.append(”\nprocess: “).append(si. process);
serviceInfo.append(”\nservice: “).append(si. service);
serviceInfo.append(”\ncrashCount: “).append(si. crashCount);
serviceInfo.append(”\nclicentCount: “).append(si. clicentCount);
serviceInfo.append(”\nactiveSince:”).append(ToolHelper.formatData(si.activeSince));
serviceInfo.append(”\nlastActivityTime: “).append(ToolHelper.formatData(si.lastAct-
ivityTime));
serviceInfo.append(”\n\n “);
}
return serviceInfo.toString();
}
上述代码调用activityManager.getRunningServices(100)获取正在运行的服务,并依次遍历得到每1个服务对应的pid,进程等信息,
1.2.5.2获取正在运行的Task信息
获取正在运行的Task信息调用的是activityManager.getRunningTasks(int maxNum)来获取对应的正在运行的使命信息列表(RunningTaskInfo),继续往前分析、显示使命信息,其要害代码如下:
public static String getRunningTaskInfo(Context context) {
StringBuffer sInfo = new StringBuffer();
final ActivityManager activityManager = (ActivityManager) context
.getSystemService(Context. ACTIVITY_SERVICE);
List tasks = activityManager.getRunningTasks(100);
Iterator l = tasks.iterator();
while (l.hasNext()) {
RunningTaskInfo ti = (RunningTaskInfo) l.next();
sInfo.append(”id: “).append(ti.id);
sInfo.append(”\nbaseActivity: “).append(ti. baseActivity.flattenToString());
sInfo.append(”\nnumActivities: “).append(ti. nnumActivities);
sInfo.append(”\nnumRunning: “).append(ti. numRunning);
sInfo.append(”\ndescription: “).append(ti. description);
sInfo.append(”\n\n);
}
Return sInfo.toString();
}
上述代码调用体系供给的activityManager.getRunningTasks(100)要领获取使命列表,依次获取对应的id等信息,运行效果如图22。从图中显示可以看出,获取手机上正在运行的Task的列表和其对应的进程信息,这对用户相识装备运行情况非常有效。
1.2.5.3获取正在运行的进程信息
该段程序是通过CMD Executo的方式来运行体系命令。要害代码如下:
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”, “l” };
result = cmdexe.run(args, “/system/bin/”);
} catch (IOException ex) {
Log.i(”fetch_process_info”,”ex=” + ex.toString());
}
return result;
}
通过这个功效可以非常详细地相识到正在运行的进程和各个进程所耗损的资源情况。
1.2.6文件浏览器
文件浏览器的这个功效,用户可以遍历浏览整个文件体系,以便更好地相识手机装备状态。在主界面裸机最后一行将执行下列代码:
case 4:
intent.setClass(eoeInfosAssistant.this, FSExplorer.class);
startActivity(intent);
break;
对于怎样进入子目录,并获取和显示其内部的文件夹日文件,也就是裸机每一行时响应的使成为事实,代码如下:
@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();
}
}
2. Android编程获取手机型号,網絡類型,本机手机号码,sdk版本及firmware版本号(即体系版本号)
Android研发平台中,可通过TelephonyManager获取本机号码。
TelephonyManager phoneMgr=(TelephonyManager)this.getSystemService(Context.TELEPHONY_SERVICE);
txtPhoneNumber.setText(phoneMgr.getLine1Number()); //txtPhoneNumber是1个EditText 用于显示手机号
注:
按照Android的安全机制,在使用TelephonyManager时,必须在AndroidManifest.xml中添加android:name=”READ_PHONE_STATE” /> 不然无法获得体系的容许。
private void loadPhoneStatus()
{
TelephonyManager phoneMgr=(TelephonyManager)this.getSystemService(Context.TELEPHONY_SERVICE);
int mNetworkType = mManager.getNetworkType();//獲取網絡類型
txtPhoneModel.setText(Build.MODEL); //手机型号
txtPhoneNumber.setText(phoneMgr.getLine1Number());//本机手机号码
txtSdkVersion.setText(Build.VERSION.SDK);//SDK版本号
txtOsVersion.setText(Build.VERSION.RELEASE);//Firmware/OS 版本号
}
Build能向咱们供给包孕 硬件厂商,硬件编号,序列号等许多信息 调用要领也都同上.
3. 得到系統的一些相關的屬性,通過調用System.getProperties(); 來獲取
02-09 02:24:55.863: INFO/Tag(661): System Property:{java.vm.version=1.2.0
02-09 02:24:55.863: INFO/Tag(661): System Property:java.vendor.url=http://www.android.com/
02-09 02:24:55.863: INFO/Tag(661): System Property:java.vm.vendor.url=http://www.android.com/
02-09 02:24:55.863: INFO/Tag(661): System Property:user.dir=/
02-09 02:24:55.872: INFO/Tag(661): System Property:java.vm.name=Dalvik
02-09 02:24:55.872: INFO/Tag(661): System Property:java.home=/system
02-09 02:24:55.872: INFO/Tag(661): System Property:user.region=US
02-09 02:24:55.872: INFO/Tag(661): System Property:javax.net.ssl.trustStore=/system/etc/security/cacerts.bks
02-09 02:24:55.872: INFO/Tag(661): System Property:java.runtime.name=Android Runtime
02-09 02:24:55.882: INFO/Tag(661): System Property:user.home=
02-09 02:24:55.882: INFO/Tag(661): System Property:java.io.tmpdir=/sdcard
02-09 02:24:55.882: INFO/Tag(661): System Property:http.agent=Dalvik/1.2.0 (Linux; U; Android 2.2; google_sdk Build/FRF91)
02-09 02:24:55.882: INFO/Tag(661): System Property:java.net.preferIPv6Addresses=true
02-09 02:24:55.882: INFO/Tag(661): System Property:java.version=0
02-09 02:24:55.882: INFO/Tag(661): System Property:java.boot.class.path=/system/framework/core.jar:/system/framework/ext.jar:/system/framework/framework.jar:/system/framework/android.policy.jar:/system/framework/services.jar
02-09 02:24:55.882: INFO/Tag(661): System Property:java.library.path=/system/lib
02-09 02:24:55.882: INFO/Tag(661): System Property:file.separator=/
02-09 02:24:55.882: INFO/Tag(661): System Property:java.specification.vendor=The Android Project
02-09 02:24:55.894: INFO/Tag(661): System Property:file.encoding=UTF-8
02-09 02:24:55.894: INFO/Tag(661): System Property:line.separator=
02-09 02:24:55.894: INFO/Tag(661): System Property:java.vm.specification.version=0.9
02-09 02:24:55.894: INFO/Tag(661): System Property:java.vm.specification.vendor=The Android Project
02-09 02:24:55.894: INFO/Tag(661): System Property:os.name=Linux
02-09 02:24:55.894: INFO/Tag(661): System Property:java.vm.vendor=The Android Project
02-09 02:24:55.894: INFO/Tag(661): System Property:path.separator=:
02-09 02:24:55.904: INFO/Tag(661): System Property:android.vm.dexfile=true
02-09 02:24:55.904: INFO/Tag(661): System Property:java.ext.dirs=
02-09 02:24:55.904: INFO/Tag(661): System Property:java.class.path=.
02-09 02:24:55.904: INFO/Tag(661): System Property:os.version=2.6.29-00261-g0097074-dirty
02-09 02:24:55.904: INFO/Tag(661): System Property:java.specification.name=Dalvik Core Library
02-09 02:24:55.904: INFO/Tag(661): System Property:java.compiler=
02-09 02:24:55.913: INFO/Tag(661): System Property:user.language=en
02-09 02:24:55.913: INFO/Tag(661): System Property:user.name=
02-09 02:24:55.913: INFO/Tag(661): System Property:os.arch=armv5tejl
02-09 02:24:55.913: INFO/Tag(661): System Property:java.runtime.version=0.9
02-09 02:24:55.913: INFO/Tag(661): System Property:java.class.version=46.0
02-09 02:24:55.913: INFO/Tag(661): System Property:java.vendor=The Android Project
02-09 02:24:55.923: INFO/Tag(661): System Property:java.vm.specification.name=Dalvik Virtual Machine Specification
02-09 02:24:55.923: INFO/Tag(661): System Property:java.specification.version=0.9}
4.得到鍵盤信息,使用的語言,手機的網絡代碼(mnc),手機的國家代碼(mcc),手機的模式,手機的方向,觸摸屏的判斷等,通過以下語句獲取:Configuration config = getResources().getConfiguration();
這些屬性都在config的屬性變量中進行判斷。