Android 应用软件安装后会有一些关于本应用的消息。这些应用基本消息对于我们开发者来说很重要当你要更新应用版本的时候或者A应用启动B应用等。所以怎么来获取手机设备上应用软件的基本信息是独立开发者不会的活。
A、问题:
1、怎么获取设备应用信息;
2、怎么判断应用是否是系统应用;
3、获取应用信息能干啥?
应用信息基类:AppInfo
import android.graphics.drawable.Drawable;
import android.util.Log;
/**
*
* @author 野虎
* 2016年2月23日上午11:53:52
*/
public class AppInfo {
public String appName ; // 应用名
public String packageName ; // 包名
public String versionName ; // 版本名
public int versionCode = 0; // 版本号
public Drawable appIcon = null; // 应用图标
@Override
public String toString() {
return appName+" , "+packageName+" ,"+versionName+" ,"+versionCode;
}
}
核心类:应用信息工具类 ApplicationInfoUtil
import java.util.ArrayList;
import java.util.List;
import android.content.Context;
import android.content.pm.ApplicationInfo;
import android.content.pm.PackageInfo;
import android.content.pm.PackageManager;
import android.content.pm.PackageManager.NameNotFoundException;
/**
* 应用信息获取类
*
* @author 野虎
* @时间 2016年2月23日下午3:47:13
*/
public class ApplicationInfoUtil {
public static final int DEFAULT = 0; // 默认 所有应用
public static final int SYSTEM_APP = DEFAULT + 1; // 系统应用
public static final int NONSYSTEM_APP = DEFAULT + 2; // 非系统应用
/**
* 根据包名获取相应的应用信息
*
* @param context
* @param packageName
* @return 返回包名所对应的应用程序的名称。
*/
public static String getProgramNameByPackageName(Context context,
String packageName) {
PackageManager pm = context.getPackageManager();
String name = null;
try {
name = pm.getApplicationLabel(
pm.getApplicationInfo(packageName,
PackageManager.GET_META_DATA)).toString();
} catch (NameNotFoundException e) {
e.printStackTrace();
}
return name;
}
/**
* 获取手机所有应用信息
*
* @param applist
* @param context
*/
public static void getAllProgramInfo(List<AppInfo> allApplist,
Context context) {
getAllProgramInfo(allApplist, context, DEFAULT);
}
/**
* 获取手机所有应用信息
*
* @param applist
* @param context
* @param type
* 标识符 是否区分系统和非系统应用
*/
public static void getAllProgramInfo(List<AppInfo> applist,
Context context, int type) {
ArrayList<AppInfo> appList = new ArrayList<AppInfo>(); // 用来存储获取的应用信息数据
List<PackageInfo> packages = context.getPackageManager()
.getInstalledPackages(0);
for (int i = 0; i < packages.size(); i++) {
PackageInfo packageInfo = packages.get(i);
AppInfo tmpInfo = new AppInfo();
tmpInfo.appName = packageInfo.applicationInfo.loadLabel(
context.getPackageManager()).toString();
tmpInfo.packageName = packageInfo.packageName;
tmpInfo.versionName = packageInfo.versionName;
tmpInfo.versionCode = packageInfo.versionCode;
tmpInfo.appIcon = packageInfo.applicationInfo.loadIcon(context
.getPackageManager());
switch (type) {
case NONSYSTEM_APP:
if (!isSystemAPP(packageInfo)) {
applist.add(tmpInfo);
}
break;
case SYSTEM_APP:
if (isSystemAPP(packageInfo)) {
applist.add(tmpInfo);
}
break;
default:
applist.add(tmpInfo);
break;
}
}
}
/**
* 获取所有系统应用信息
*
* @param context
* @return
*/
public static List<AppInfo> getAllSystemProgramInfo(Context context) {
List<AppInfo> systemAppList = new ArrayList<AppInfo>();
getAllProgramInfo(systemAppList, context, SYSTEM_APP);
return systemAppList;
}
/**
* 获取所有非系统应用信息
*
* @param context
* @return
*/
public static List<AppInfo> getAllNonsystemProgramInfo(Context context) {
List<AppInfo> nonsystemAppList = new ArrayList<AppInfo>();
getAllProgramInfo(nonsystemAppList, context, NONSYSTEM_APP);
return nonsystemAppList;
}
/**
* 判断是否是系统应用
*
* @param packageInfo
* @return
*/
public static Boolean isSystemAPP(PackageInfo packageInfo) {
if ((packageInfo.applicationInfo.flags & ApplicationInfo.FLAG_SYSTEM) == 0) { // 非系统应用
return false;
} else { // 系统应用
return true;
}
}
}
UI显示类:MainActivity
import java.util.ArrayList;
import java.util.List;
import android.app.Activity;
import android.content.res.Resources;
import android.os.Bundle;
import android.view.Menu;
import android.view.MenuItem;
import android.view.View;
import android.widget.ListView;
import android.widget.TextView;
public class MainActivity extends Activity {
private TextView tv_flag;
private ListView lv;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
tv_flag = (TextView) findViewById(R.id.tv_flag);
lv = (ListView) findViewById(R.id.lv);
}
public void appInfo_all(View v) {
List<AppInfo> appList = new ArrayList<AppInfo>();
ApplicationInfoUtil.getAllProgramInfo(appList, this);
setAdapter(appList);
tv_flag.setText(getResources().getString(R.string.appInfo_all)+appList.size()+"个");
}
public void appInfo_system(View v) {
List<AppInfo> systemAppList = ApplicationInfoUtil.getAllSystemProgramInfo(this);
setAdapter(systemAppList);
tv_flag.setText(getResources().getString(R.string.appInfo_system)+systemAppList.size()+"个");
}
public void appInfo_nonsystem(View v) {
List<AppInfo> nonsystemAppList = ApplicationInfoUtil.getAllNonsystemProgramInfo(this);
setAdapter(nonsystemAppList);
tv_flag.setText(getResources().getString(R.string.appInfo_nonsystem)+nonsystemAppList.size()+"个");
}
public void setAdapter(List<AppInfo> appList){
AppInfoAdapter adapter = new AppInfoAdapter(this, appList);
lv.setAdapter(adapter);
}
}
布局很简单就不贴了^_^ !
效果图如下: