衆所周知,通過packagemanager可以擷取手機端已安裝的apk檔案的資訊,具體代碼如下
view plaincopy to clipboardprint?
packagemanager packagemanager = this.getpackagemanager();
list<packageinfo> packageinfolist = packagemanager.getinstalledpackages(0);
packagemanager packagemanager = this.getpackagemanager();
list<packageinfo> packageinfolist = packagemanager.getinstalledpackages(0);
通過以上方法,可以得到手機中安裝的所有應用程式,既包括了手動安裝的apk包的資訊,也包括了系統預裝的應用軟體的資訊,要區分這兩類軟體可使用以下方法:
a.從packageinfolist擷取的packageinfo,再通過packageinfo.applicationinfo擷取applicationinfo。
b.判斷(applicationinfo.flags & applicationinfo.flag_system)的值,該值大于0時,表示擷取的應用為系統預裝的應用,反之則為手動安裝的應用。
大家可以看下代碼,說明已經寫在注釋中。
擷取應用的代碼:
/**
* 查詢手機内非系統應用
* @param context
* @return
*/
public static list<packageinfo> getallapps(context context) {
list<packageinfo> apps = new arraylist<packageinfo>();
packagemanager pmanager = context.getpackagemanager();
//擷取手機内所有應用
list<packageinfo> paklist = pmanager.getinstalledpackages(0);
for (int i = 0; i < paklist.size(); i++) {
packageinfo pak = (packageinfo) paklist.get(i);
//判斷是否為非系統預裝的應用程式
if ((pak.applicationinfo.flags & pak.applicationinfo.flag_system) <= 0) {
// customs applications
apps.add(pak);
}
}
return apps;
}
/**
* 查詢手機内非系統應用
* @param context
* @return
*/
public static list<packageinfo> getallapps(context context) {
list<packageinfo> apps = new arraylist<packageinfo>();
packagemanager pmanager = context.getpackagemanager();
//擷取手機内所有應用
list<packageinfo> paklist = pmanager.getinstalledpackages(0);
for (int i = 0; i < paklist.size(); i++) {
packageinfo pak = (packageinfo) paklist.get(i);
//判斷是否為非系統預裝的應用程式
if ((pak.applicationinfo.flags & pak.applicationinfo.flag_system) <= 0) {
// customs applications
apps.add(pak);
}
}
return apps;
}
擷取圖檔、應用名、包名:
packagemanager pmanager = messagesendactivity.this.getpackagemanager();
list<packageinfo> applist = utils.getallapps(messagesendactivity.this);
for(int i=0;i<applist.size();i++) {
packageinfo pinfo = applist.get(i);
shareiteminfo shareitem = new shareiteminfo();
//set icon
shareitem.seticon(pmanager.getapplicationicon(pinfo.applicationinfo));
//set application name
shareitem.setlabel(pmanager.getapplicationlabel(pinfo.applicationinfo).tostring());
//set package name
shareitem.setpackagename(pinfo.applicationinfo.packagename);
packagemanager pmanager = messagesendactivity.this.getpackagemanager();
list<packageinfo> applist = utils.getallapps(messagesendactivity.this);
for(int i=0;i<applist.size();i++) {
packageinfo pinfo = applist.get(i);
shareiteminfo shareitem = new shareiteminfo();
//set icon
shareitem.seticon(pmanager.getapplicationicon(pinfo.applicationinfo));
//set application name
shareitem.setlabel(pmanager.getapplicationlabel(pinfo.applicationinfo).tostring());
//set package name
shareitem.setpackagename(pinfo.applicationinfo.packagename);
}
其中 shareiteminfo 類是我本地自定義的,各位可以忽略!
另為,有人可能在找 分享應用清單,在此一并說下吧。
擷取支援分享的應用的代碼:
* 查詢手機内所有支援分享的應用
public static list<resolveinfo> getshareapps(context context){
list<resolveinfo> mapps = new arraylist<resolveinfo>();
intent intent=new intent(intent.action_send,null);
intent.addcategory(intent.category_default);
intent.settype("text/plain");
mapps = pmanager.queryintentactivities(intent,packagemanager.component_enabled_state_default);
return mapps;
* 查詢手機内所有支援分享的應用
public static list<resolveinfo> getshareapps(context context){
list<resolveinfo> mapps = new arraylist<resolveinfo>();
intent intent=new intent(intent.action_send,null);
intent.addcategory(intent.category_default);
intent.settype("text/plain");
packagemanager pmanager = context.getpackagemanager();
mapps = pmanager.queryintentactivities(intent,packagemanager.component_enabled_state_default);
return mapps;
由于該方法,傳回的并不是 packageinfo 對象。而是 resolveinfo。是以擷取圖檔、應用名、包名的方法不一樣,如下:
/*********************查詢手機内所有支援分享的應用*********************/
list<resolveinfo> resolvelist = utils.getshareapps(messagesendactivity.this);
for(int i=0;i<resolvelist.size();i++) {
resolveinfo resolve = resolvelist.get(i);
shareitem.seticon(resolve.loadicon(pmanager));
shareitem.setlabel(resolve.loadlabel(pmanager).tostring());
shareitem.setpackagename(resolve.activityinfo.packagename);
/*********************查詢手機内所有支援分享的應用*********************/
list<resolveinfo> resolvelist = utils.getshareapps(messagesendactivity.this);
for(int i=0;i<resolvelist.size();i++) {
resolveinfo resolve = resolvelist.get(i);
shareitem.seticon(resolve.loadicon(pmanager));
shareitem.setlabel(resolve.loadlabel(pmanager).tostring());
shareitem.setpackagename(resolve.activityinfo.packagename);
--------------------------------------------------------------------------------
總結:
通過 packageinfo 擷取具體資訊方法:
包名擷取方法:packageinfo.packagename
icon擷取擷取方法:packagemanager.getapplicationicon(applicationinfo)
應用名稱擷取方法:packagemanager.getapplicationlabel(applicationinfo)
使用權限擷取方法:packagemanager.getpackageinfo(packagename,packagemanager.get_permissions)
.requestedpermissions
通過 resolveinfo 擷取具體資訊方法:
包名擷取方法:resolve.activityinfo.packagename
icon擷取擷取方法:resolve.loadicon(packagemanager)
應用名稱擷取方法:resolve.loadlabel(packagemanager).tostring()