Android獲取應用資訊(AndroidManifest)
主要利用兩個資訊類:PackageInfo、ApplicationInfo
一、獲取應用PackageInfo資訊
以下packageManager都用這個表示
PackageManager packageManager = context.getPackageManager();
獲取方式
==獲取不同資訊主要是傳入不同的flag值==
//第一個引數傳入應用包名, //第二個引數是一個flag表示你想要獲取哪些資訊,比如下例的activity資訊及activity標籤下的metadata資訊 PackageInfo packageInfo = packageManager.getPackageInfo(packageName, PackageManager.GET_ACTIVITIES | PackageManager.GET_META_DATA);
具體資訊獲取
1、許可權資訊(AndroidManifest中<uses-permission/>標籤中資訊列表)
String[] permisions = packageManager.getPackageInfo(packageName, PackageManager.GET_PERMISSIONS).requestedPermissions;
2、版本資訊
PackageInfo packageInfo = packageManager.getPackageInfo(packageName, 0); String versionName = packageInfo.versionName; int versionCode = packageInfo.versionCode;
3、其他資訊
比如sharedUserId、packageName等等
二、獲取ApplicationInfo資訊
獲取方式
//由上述packageInfo中獲取得到 ApplicationInfo applicationInfo = packageInfo.applicationInfo;
具體資訊獲取
1、應用名稱
String appName = (String) applicationInfo.loadLabel(packageManager);
2、應用圖示
Drawable appIcon = applicationInfo.loadIcon(packageManager);
3、其他資訊
比如taskAffinity、processName、theme等
三、獲取元件資訊(ActivityInfo、ServiceInfo、ProviderInfo)
ActvitityInfo
==Activity或者BroadcastReceiver資訊都是通過ActivityInfo獲取的==
獲取方式
//flag值必須包含PackageManager.GET_ACTIVITIES,如果還要獲取其他資訊如metadata則增加一個flag值PackageManager.GET_META_DATA PackageInfo packageInfo = packageManager.getPackageInfo(packageName,PackageManager.GET_ACTIVITIES); //activity資訊 ActivityInfo[] activities = packageInfo.activities; //flag值必須包含PackageManager.GET_RECEIVERS,如果還要獲取其他資訊如metadata則增加一個flag值PackageManager.GET_META_DATA PackageInfo packageInfo = packageManager.getPackageInfo(packageName,PackageManager.GET_RECEIVERS); //broadcastreceiver資訊 ActivityInfo[] receivers = packageInfo.receivers
具體資訊獲取
1、activity全路徑
String activityClassName = activityInfo.name;
2、其他資訊
比如theme、launchMode、taskAffinity等
ServiceInfo
Service資訊通過ServiceInfo獲取
獲取方式
//flag值必須包含PackageManager.GET_SERVICES,如果還要獲取其他資訊如metadata則增加一個flag值PackageManager.GET_META_DATA PackageInfo packageInfo = packageManager.getPackageInfo(packageName,PackageManager.GET_SERVICES); ServiceInfo[] services = packageInfo.services;
具體資訊獲取
比如flags、permission
ProviderInfo
ContentProvider資訊通過ProviderInfo獲取
獲取方式
//flag值必須包含PackageManager.GET_PROVIDERS,如果還要獲取其他資訊如metadata則增加一個flag值PackageManager.GET_META_DATA PackageInfo packageInfo = packageManager.getPackageInfo(packageName,PackageManager.GET_PROVIDERS); ServiceInfo[] services = packageInfo.services;
具體資訊獲取
比如authority、readPermission、writePermission等
四、使用例項
1、根據包名獲取應用資訊
//首先獲取packageManager PackageManager packageManager = context.getPackageManager(); //獲取packageInfo資訊 PackageInfo packageInfo = packageManager.getPackageInfo(packageName, 0); //獲取應用版本號 int versionCode = packageInfo.versionCode; //獲取應用版本名 String versionName = packageInfo.versionName; //獲取應用名稱 String appName = (String) packageInfo.applicationInfo.loadLabel(packageManager); //獲取應用圖示 Drawable appIcon = packageInfo.applicationInfo.loadIcon(packageManager) //<application/>標籤下metadata獲取 ApplicationInfo applicationInfo = packageManager.getApplicationInfo(packageName, PackageManager.GET_META_DATA); Bundle metadata = applicationInfo.metaData;//然後通過改bundle獲取相應值,用法見bundle //<activity/>標籤下metadata獲取(其他service\receiver\provider同理,切換flag即可) //入口資訊獲取 PackageInfo packageInfo = packageManager.getPackageInfo(packageName, PackageManager.GET_ACTIVITIES | PackageManager.GET_META_DATA); ActivityInfo[] activityInfos = packageInfo.activities; for (ActivityInfo activityInfo : activityInfos) { Bundle metadata = activityInfo.metaData;//然後通過改bundle獲取相應值,用法 見bundle String activityClassName = activityInfo.name; }
2、擴充套件(直接獲取未安裝apk資訊)
PackageManager packageManager = context.getPackageManager(); //apkPath傳入apk絕對路徑 PackageInfo pInfo = packageManager.getPackageArchiveInfo(apkPath, PackageManager.GET_ACTIVITIES); if (pInfo != null) { //包名 String packageName = pInfo.packageName; //版本名 String versionCode = pInfo.versionName; //版本號 String versionCode = pInfo.versionCode; ApplicationInfo appInfo = pInfo.applicationInfo; /** 必須加這兩句,不然下面icon獲取是default icon而不是應用包的icon */ appInfo.sourceDir = apkPath; appInfo.publicSourceDir = apkPath; //應用名 String appName = appInfo.loadLabel(packageManager).toString(); //應用圖示 Drawable appIcon = packageManager.getApplicationIcon(appInfo); //...其他資訊同上獲取已安裝應用資訊一樣 }
3、根據包名開啟應用LauncherActivity
public static void openApplication(Context context, String packageName) throws Exception { Intent launcherIntent = new Intent("android.intent.action.MAIN", null); launcherIntent.addCategory("android.intent.category.LAUNCHER"); launcherIntent.setPackage(packageName); ResolveInfo localResolveInfo = (ResolveInfo) context.getPackageManager() .queryIntentActivities(launcherIntent, 0).iterator().next(); if (localResolveInfo != null) { String str = localResolveInfo.activityInfo.name; Intent targetIntent = new Intent(Intent.ACTION_MAIN); targetIntent.addCategory(Intent.CATEGORY_LAUNCHER); targetIntent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK); targetIntent.setComponent(new ComponentName(packageName, str)); context.startActivity(localIntent2); }
4、獲取所有已安裝應用資訊
PackageManager packageManager = mContext.getPackageManager(); List<PackageInfo> mPacks = packageManager.getInstalledPackages(0); for(PackageInfo packageInfo : mPacks) { //是否是系統應用 boolean isUserApp = (packageInfo.applicationInfo.flags & ApplicationInfo.FLAG_SYSTEM) == 0; //...同上獲取其他資訊 }
5、獲取應用大小資料
packageManager.getPackageSizeInfo(packageName, new IPackageStatsObserver.Stub() { @Override public void onGetStatsCompleted(PackageStats packageStats, boolean b) throws RemoteException { String package = packageStats.packageName; long totalSize = packageStats.cacheSize + packageStats.codeSize + packageStats.dataSize; });