Android 怎样获得手机信息
获取当前的网络类型是WIFI还是GPRS
public static String getCurrentNetType(Context context) {
ConnectivityManager connManager = (ConnectivityManager) context.getSystemService(Context.CONNECTIVITY_SERVICE);
NetworkInfo wifi = connManager.getNetworkInfo(ConnectivityManager.TYPE_WIFI);
NetworkInfo gprs = connManager.getNetworkInfo(ConnectivityManager.TYPE_MOBILE);
TelephonyManager telMgr = (TelephonyManager) context.getSystemService(Context.TELEPHONY_SERVICE);
if (wifi != null && wifi.getState() == State.CONNECTED) {
return "wifi";
} else if (gprs != null && gprs.getState() == State.CONNECTED) {
return "mobile_" + telMgr.getNetworkType();
}
return "";
}
android里 通过Intent来启动其他非系统应用程序
android应用程序内部通过Intent来实现Activity间的跳转。也知道通过Intent调用系统程序。但若想在应用程序A内开启应用程序B(前提是A、B均已安装),该如何去实现?记录下实现过程。
在应用程序A内添加如下代码:
- Intent i = new Intent();
- i.setClassName("com.example.a",
- "com.example.a.AActivity");
- startActivity(i);
Intent i = new Intent();
i.setClassName("com.example.a",
"com.example.a.AActivity");
startActivity(i);
或者
- Intent i = new Intent();
- ComponentName cn = new ComponentName("com.example.b",
- "com.example.b.BActivity");
- i.setComponent(cn);
- startActivity(i);
Intent i = new Intent();
ComponentName cn = new ComponentName("com.example.b",
"com.example.b.BActivity");
i.setComponent(cn);
startActivity(i);
注:
com.example.a是应用程序B的包名
com.example.a.AActivity是应用程序B你将要启动的Activtiy
这样就可以OK了,附上demo见资源里面。
android启动其他应用的一段代码
- private void startAppByPackageName(String packageName){
- PackageInfo pi = null;
- try {
- pi = getPackageManager().getPackageInfo(packageName, 0);
- } catch (NameNotFoundException e) {
- e.printStackTrace();
- }
- Intent resolveIntent = new Intent(Intent.ACTION_MAIN,null);
- resolveIntent.addCategory(Intent.CATEGORY_LAUNCHER);
- resolveIntent.setPackage(pi.packageName);
- List<ResolveInfo> apps = getPackageManager().queryIntentActivities(resolveIntent,0);
- ResolveInfo ri = apps.iterator().next();
- if (ri != null ) {
- String packageName1 = ri.activityInfo.packageName;
- String className = ri.activityInfo.name;
- Intent intent = new Intent(Intent.ACTION_MAIN);
- intent.addCategory(Intent.CATEGORY_LAUNCHER);
- ComponentName cn = new ComponentName(packageName1, className);
intent.setComponent(cn);
//增加下面FLAG可以实现
//在android应用程序中启动其他apk程序,被启动程序退出后返回之前的程序?
intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
startActivity(intent);
}
}
public void getRunningProcess(){
//正在运行的
ActivityManager am = (ActivityManager) getSystemService(ACTIVITY_SERVICE);
//获取正在运行的应用
List<RunningAppProcessInfo> run = am.getRunningAppProcesses();
//获取包管理器,在这里主要通过包名获取程序的图标和程序名
PackageManager pm =this.getPackageManager();
for(RunningAppProcessInfo ra : run){
//这里主要是过滤系统的应用和电话应用,当然你也可以把它注释掉。
if(ra.processName.equals("system") || ra.processName.equals("com.android.phone")){
continue;
}
String packetname=ra.processName;//com.google.android.googlequicksearchbox
}
}
检测某ActivityUpdate是否在当前Task的栈顶
public static boolean isTopActivy(String cmdName, Context context)
{
ActivityManager manager = (ActivityManager) context.getSystemService(Context.ACTIVITY_SERVICE);
List<RunningTaskInfo> runningTaskInfos = manager.getRunningTasks(Integer.MAX_VALUE);
String cmpNameTemp = null;
if (null != runningTaskInfos)
{
cmpNameTemp = (runningTaskInfos.get(0).topActivity).toString();
}
if (null == cmpNameTemp)
{
return false;
}
return cmpNameTemp.equals(cmdName);
}
判断Android应用是否在前台
public static boolean isAppOnForeground(Context context)
{
ActivityManager activityManager = (ActivityManager) context.getSystemService(Context.ACTIVITY_SERVICE);
String packageName = context.getPackageName();
List<RecentTaskInfo> appTask = activityManager.getRecentTasks(Integer.MAX_VALUE, 1);
if (appTask == null)
{
return false;
}
if (appTask.get(0).baseIntent.toString().contains(packageName))
{
return true;
}
return false;
}
获取Android手机内安装的所有桌面
private static List<String> getAllTheLauncher(Context context)
{
List<String> names = null;
PackageManager pkgMgt = context.getPackageManager();
Intent it = new Intent(Intent.ACTION_MAIN);
it.addCategory(Intent.CATEGORY_HOME);
List<ResolveInfo> ra = pkgMgt.queryIntentActivities(it, 0);
if (ra.size() != 0)
{
names = new ArrayList<String>();
}
for (int i = 0; i < ra.size(); i++)
{
String packageName = ra.get(i).activityInfo.packageName;
names.add(packageName);
}
return names;
}
Android 判断程序前后台状态
public static boolean isLauncherRunnig(Context context)
{
boolean result = false;
List<String> names = getAllTheLauncher(context);
ActivityManager mActivityManager = (ActivityManager) context.getSystemService(Context.ACTIVITY_SERVICE);
List<ActivityManager.RunningAppProcessInfo> appList = mActivityManager.getRunningAppProcesses();
for (RunningAppProcessInfo running : appList)
{
if (running.importance == RunningAppProcessInfo.IMPORTANCE_FOREGROUND)
{
for (int i = 0; i < names.size(); i++)
{
if (names.get(i).equals(running.processName))
{
result = true;
break;
}
}
}
}
return result;
}
//获取APK的基本信息
public void getApkInfo(){
List<PackageInfo> packs = getPackageManager().getInstalledPackages(PackageManager.GET_UNINSTALLED_PACKAGES);
for (PackageInfo pi : packs)
{
String apkName=pi.applicationInfo.loadLabel(getPackageManager()).toString();
String apkVerName=pi.versionName;
int apkVerCode= pi.versionCode;
Drawable icon = pi.applicationInfo.loadIcon(getPackageManager());
String packageName = pi.packageName;
String ff =pi.applicationInfo.publicSourceDir;//=/system/framework/framework-res.apk /data/app/cn.findmm-1.apk
String apkSize = formetFileSize((new File(pi.applicationInfo.publicSourceDir)).length());
}
}
//根据应用名获取应用版本号
public String getInstallAppPackageVersion()
{
String s="UC浏览器";
String s1;
List list;
int i;
s1 = null;
list = getPackageManager().getInstalledPackages(PackageManager.GET_UNINSTALLED_PACKAGES);
for(i = 0;i<list.size();i++){
PackageInfo packageinfo = (PackageInfo)list.get(i);
String s2 = packageinfo.applicationInfo.loadLabel(getPackageManager()).toString();
if (packageinfo.applicationInfo.publicSourceDir.contains("/data/app") && s.equals(s2))
{
s1 = packageinfo.versionName;
break;
}
}
return s1;
}
//由包名com.google.android.googlequicksearchbox 得到APK文件的路径名/system/app/Velvet.apk
public String getApkFile(){
String s="com.google.android.googlequicksearchbox";
String s1;
String as[];
int i;
s1 = null;
as = (new File("/system/app/")).list();
for(i=0;i < as.length;i++){
if (getApkPackageName((new StringBuilder("/system/app/")).append(as[i]).toString()).contains(s)){
return s1 = (new StringBuilder("/system/app/")).append(as[i]).toString();//Velvet.apk
}
}
return s1;
}
public String getApkPackageName(String s)
{
PackageInfo packageinfo = getPackageManager().getPackageArchiveInfo(s, 1);
String s1 = null;
if (packageinfo != null)
{
s1 = packageinfo.applicationInfo.packageName;
}
return s1;
}
private boolean checkPackageExist() {
List<PackageInfo> packs = getPackageManager().getInstalledPackages(PackageManager.GET_UNINSTALLED_PACKAGES);
for (PackageInfo pi : packs)
{
String apkName=pi.applicationInfo.loadLabel(getPackageManager()).toString();
String apkVerName=pi.versionName;
int apkVerCode= pi.versionCode;
Drawable icon = pi.applicationInfo.loadIcon(getPackageManager());
String packageName = pi.packageName;
String apkSize = formetFileSize((new File(pi.applicationInfo.publicSourceDir)).length());
File file = new File(pi.applicationInfo.publicSourceDir);
if (!file.exists()){
continue;
}
//pi.versionCode
//pi.versionName
//pi.packageName
//pi.applicationInfo
if(pi.packageName.equals("com.android.email") ){
return true;
}
}
return false;
}
public static String formetFileSize(long l)
{
DecimalFormat decimalformat = new DecimalFormat("#.00");
String s;
if (l < 1024L)
s = (new StringBuilder(String.valueOf(decimalformat.format(l)))).append("B").toString();
else
if (l < 0x100000L)
s = (new StringBuilder(String.valueOf(decimalformat.format((double)l / 1024D)))).append("K").toString();
else
if (l < 0x40000000L)
s = (new StringBuilder(String.valueOf(decimalformat.format((double)l / 1048576D)))).append("M").toString();
else
s = (new StringBuilder(String.valueOf(decimalformat.format((double)l / 1073741824D)))).append("G").toString();
return s;
}
public boolean istop_focusactivity(){
ActivityManager activityManager = (ActivityManager) this.getSystemService(ACTIVITY_SERVICE);
ComponentName cn = activityManager.getRunningTasks(1).get(0).topActivity;
String activityname=cn.getClassName();
if(activityname.equals("com.example.test.MainActivity")){
return true;
}
else{
return false;
}
}
public boolean in_top_activity(){
// 获取的正在运行的activity的最大数量(防止太多,系统承受不了啊)、
int maxNum = 40;
// ActivityManager的功能是为系统中所有运行着的Activity交互提供了接口,主要的接口围绕着运行中的进程信息,任务信息,服务信息等
ActivityManager activityManager = (ActivityManager) this.getSystemService(ACTIVITY_SERVICE);
List<ActivityManager.RunningTaskInfo> runningTasks = activityManager.getRunningTasks(maxNum);
for(ActivityManager.RunningTaskInfo taskInfo:runningTasks){
if(taskInfo.baseActivity.getClassName().equals("com.cyanogenmod.trebuchet.Launcher")){
return true;
}
}
return false;
}
- /**
- * PackageManager介绍:
- * 本类API是对所有基于加载信息的数据结构的封装,包括以下功能:
- * 安装,卸载应用 查询permission相关信息 查询Application相关
- * 信息(application,activity,receiver,service,provider及相应属性等)
- * 查询已安装应用 增加,删除permission 清除用户数据、缓存,代码段等 非查询相关的API需要特定的权限。
- * 主要包含了,安装在当前设备上的应用包的相关信息
- * 如下:获取已经安装的应用程序的信息
- */
- private HashMap<String, String> installPackagesInfo(){
- // 获取packageManager对象
- PackageManager packageManager = this.getPackageManager();
- /*getInstalledApplications 返回当前设备上安装的应用包集合
- * ApplicationInfo对应着androidManifest.xml中的application标签。通过它可以获取该application对应的信息
- */
- List<ApplicationInfo> applicationInfos = packageManager.getInstalledApplications(0);
- HashMap<String, String> resultMap = new HashMap<String, String>();
- Iterator<ApplicationInfo> iterator = applicationInfos.iterator();
- while(iterator.hasNext()){
- ApplicationInfo applicationInfo = iterator.next();
- String packageName = applicationInfo.packageName;// 包名
- String packageLabel = packageManager.getApplicationLabel(applicationInfo).toString();//获取label
- resultMap.put(packageLabel, packageName);
- }
- return resultMap;
- }
- /**
- * 获取系统中正在运行的任务信息(强调下,任务是多个activity的集合)
- */
- public void run(){
- String info = "" ;
- // 获取的正在运行的activity的最大数量(防止太多,系统承受不了啊)、
- int maxNum = 40;
- // ActivityManager的功能是为系统中所有运行着的Activity交互提供了接口,主要的接口围绕着运行中的进程信息,任务信息,服务信息等
- ActivityManager activityManager = (ActivityManager) this.getSystemService(ACTIVITY_SERVICE);
- /**
- * 获取正在运行的任务这里一定要注意,这里我们获取的时候,
- * 你的任务或者其中的activity可能没结束,但是当你在后边使用的时候,很有可能已经被kill了哦。
- * 意思很简单,系统返给你的正在运行的task,是暂态的,仅仅代表你调用该方法时系统中的状态,
- * 至于后边是否发生了该变,系统概不负责、
- */
- List<ActivityManager.RunningTaskInfo> runningTasks = activityManager.getRunningTasks(maxNum);
- for(ActivityManager.RunningTaskInfo taskInfo:runningTasks){
- info+="一个任务信息开始:/n";
- info+="当前任务中正处于运行状态的activity数目:"+taskInfo.numRunning;
- info+="当前任务中的activity数目: "+taskInfo.numActivities;
- info+="启动当前任务的activity名称:"+taskInfo.baseActivity.getClassName();
- }
如何得到当前正在运行的activity是哪个??
ActivityManager am = (ActivityManager) context.getSystemService(Context.ACTIVITY_SERVICE);
ComponentName cn = am.getRunningTasks(1).get(0).topActivity;
Log.d("packageName", "pkg:"+cn.getPackageName());
Log.d("className", "cls:"+cn.getClassName());
加权限
<uses-permission android:name="android.permission.GET_TASKS"/>
android打电话接口、获取本机号码
打电话:
|
Intent intent = new Intent(Intent.ACTION_CALL, Uri.parse( "tel:" + "13333333333" ));
|
|
startActivity(intent); |
获取本机号码:
|
TelephonyManager tm = (TelephonyManager) this .getSystemService(Context.TELEPHONY_SERVICE);
|
|
String deviceid = tm.getDeviceId(); |
|
String tel = tm.getLine1Number(); //本机号码
|
|
String imei =tm.getSimSerialNumber(); |
|
String imsi =tm.getSubscriberId(); |
|
res.setText(deviceid+ "#" +tel+ "#" +imei+ "#" +imsi);
|
注意:
并不是所有的sim卡都可以读取到手机号,这取决与运营商是否将手机号写入到sim卡中。
基于这个原因,有人出一个曲线救国的方案:向10086发送一个短信,然后注册短信receiver从而获取到本机号码(这个没有试过)
Android判断Service是否运行
/** |
02 |
* 判断服务是否正在运行 |
03 |
* @return |
04 |
*/ |
05 |
public boolean isServiceWorked() {
|
06 |
ActivityManager myManager = (ActivityManager) getSystemService(Context.ACTIVITY_SERVICE);
|
07 |
ArrayList runningService = (ArrayList) myManager.getRunningServices(Integer.MAX_VALUE);
|
08 |
for ( int i = 0 ; i < runningService.size(); i++) {
|
09 |
if (runningService.get(i).service.getClassName().toString()
|
10 |
.equals( "com.sunnorth.eyeincar.EyeInCarService" )) {
|
11 |
return true ;
|
12 |
}
|
13 |
}
|
14 |
return false ;
|
15 |
} |
1.手机信息查看助手可行性分析
开始进入编写程序前,需要对需求的功能做一些可行性分析,以做到有的放矢,如果有些无法实现的功能,可以尽快调整。
这里分析一下项目需要的功能,主要是信息查看和信息收集,如版本信息、硬件信息等,这些都可以通过读取系统文件或者运行系统命令获取,而像获取安装的软件信息和运行时信息则需要通过API提供的接口获取。实现API接口不是什么问题,主要把精力集中在如何实现运行系统命令,获取其返回的结果功能实现上。具体实现代码如下所示:
Java代码:
- 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组件。
Java代码:
- < ?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 查看系统信息实现
当在运行的主界面单击第一行时,也就是“系统信息”这一行,将执行代码如下:
Java代码:
- 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代码:
- /**
- *系统内存情况查看
- */
- public static String getMemoryInfo(Context context) {
- StringBuffer memoryInfo = new StringBuffer();
- final ActivityManager activityManager =(ActivityManager) context.getSystemService(Context.ACTIVITY_SERVICE);
- ActivityManager.MemoryInfo outInfo = new ActivityManager.MemoryInfo();
- activityManager.getMemoryInfo(outInfo);
- memoryInfo.append(" Total Available Memory :").append(outInfo.availMem >> 10).append("k");
- memoryInfo.append(" Total Available Memory :").append(outInfo.availMem >> 20).append("k");
- memoryInfo.append(" In 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() + " " + result);
- }
上述代码中首先通过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();
- }
- }
//获取APK的基本信息
public void getApkInfo(){
List<PackageInfo> packs = getPackageManager().getInstalledPackages(PackageManager.GET_UNINSTALLED_PACKAGES);
for (PackageInfo pi : packs)
{
String apkName=pi.applicationInfo.loadLabel(getPackageManager()).toString();
String apkVerName=pi.versionName;
int apkVerCode= pi.versionCode;
Drawable icon = pi.applicationInfo.loadIcon(getPackageManager());
String packageName = pi.packageName;
String ff =pi.applicationInfo.publicSourceDir;//=/system/framework/framework-res.apk /data/app/cn.findmm-1.apk
String apkSize = formetFileSize((new File(pi.applicationInfo.publicSourceDir)).length());
}
}
//根据应用名获取应用版本号
public String getInstallAppPackageVersion()
{
String s="UC浏览器";
String s1;
List list;
int i;
s1 = null;
list = getPackageManager().getInstalledPackages(PackageManager.GET_UNINSTALLED_PACKAGES);
for(i = 0;i<list.size();i++){
PackageInfo packageinfo = (PackageInfo)list.get(i);
String s2 = packageinfo.applicationInfo.loadLabel(getPackageManager()).toString();
if (packageinfo.applicationInfo.publicSourceDir.contains("/data/app") && s.equals(s2))
{
s1 = packageinfo.versionName;
break;
}
}
return s1;
}
//由包名com.google.android.googlequicksearchbox 得到APK文件的路径名/system/app/Velvet.apk
public String getApkFile(){
String s="com.google.android.googlequicksearchbox";
String s1;
String as[];
int i;
s1 = null;
as = (new File("/system/app/")).list();
for(i=0;i < as.length;i++){
if (getApkPackageName((new StringBuilder("/system/app/")).append(as[i]).toString()).contains(s)){
return s1 = (new StringBuilder("/system/app/")).append(as[i]).toString();//Velvet.apk
}
}
return s1;
}
public String getApkPackageName(String s)
{
PackageInfo packageinfo = getPackageManager().getPackageArchiveInfo(s, 1);
String s1 = null;
if (packageinfo != null)
{
s1 = packageinfo.applicationInfo.packageName;
}
return s1;
}