不管是“ES文件瀏覽器”、“QQ”等應用,它們都可以獲取本機已安裝的應用程序信息,還可以發送安裝包(apk文件)給別人。
這兩天查了一些資料,有所收穫,整理一下,寫在下面。
第一步:獲取已安裝的應用列表
應用分爲兩種:一種是系統自帶的,另一種是用戶自己安裝的。
通過下面代碼可以獲取所有應用的信息:
List<ApplicationInfo> apps = getPackageManager().getInstalledApplications(0);
通過以下代碼判斷是否是應用分類:
if((applicationInfo.flags&ApplicationInfo.FLAG_SYSTEM)==0)
{
//非系統應用
}
else
{
//系統應用
}
第二步:獲取已安裝的應用對應的安裝文件(apk)
//這個屬性指定了apk的路徑(如:/data/app/bassy.hair.main-1.apk)
ApplicationInfo.sourceDir
//一般來說,這兩個屬性的值和上面的屬性的值相同
ApplicationInfo.publicSourceDir
ApplicationInfo.scanPublicsourceDir
默認情況下,必須要獲取root權限,才能訪問/data/app目錄的,
如果沒有root,用文件瀏覽器進入/data目錄,會發現裏面爲空,並沒有app文件夾
但是,有一點挺奇怪的,看下面截圖
上面是adb shell工具直接查詢已安裝應用apk文件的屬性
注意權限信息“-rw-r--r--”,這表明"/data/app/bassy.hair.main-1.apk"是可讀的。
換句話說,我們可以在程序中直接訪問該文件。
另外介紹ApplicationInfo的兩個常用方法:
public CharSequence loadLabel(PackageManager pm)
public Drawable loadIcon(PackageManager pm)
ApplicationInfo.loadLabel用於獲取應用程序的名稱
ApplicationInfo.loadIcon用於獲取應用程序的圖標
部分代碼:
/** 獲取已安裝應用信息(不包含系統自帶) */
private ArrayList<AppInfo> getAppInfo()
{
List<ApplicationInfo> apps = getPackageManager().getInstalledApplications(
PackageManager.GET_SIGNATURES);
ArrayList<AppInfo> infos = new ArrayList<AppInfo>();
for (ApplicationInfo info : apps)
{
if ((info.flags & ApplicationInfo.FLAG_SYSTEM) == 0)
{
// 非系統應用
AppInfo appInfo = new AppInfo();
appInfo.name = info.loadLabel(getPackageManager()).toString();
appInfo.icon = info.loadIcon(getPackageManager());
appInfo.path = info.sourceDir;
appInfo.packageName = info.packageName;
infos.add(appInfo);
}
}
return infos;
}
public class AppInfo implements Serializable
{
/** 序列號 */
private static final long serialVersionUID = -6660233212727684115L;
/** 名稱 */
public String name;
/** (路徑) */
public String path;
/** 圖標 */
public Drawable icon;
/** 包名 */
public String packageName;
}
參考資料:
http://www.cnblogs.com/mainroadlee/archive/2011/05/23/android_get_installed_app.html