天天看點

【Android】擷取手機中已安裝apk檔案資訊(PackageInfo、ResolveInfo)(應用圖檔、應用名、包名等)

衆所周知,通過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()

繼續閱讀