【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时,表示获取的应用为系统预装的应用,反之则为手动安装的应用。

大家可以看下代码,说明已经写在注释中。

获取应用的代码:

view plaincopy to clipboardprint?
/**
 * 查询手机内非系统应用
 * @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;
 }

 

获取图片、应用名、包名:

 

view plaincopy to clipboardprint?
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 类是我本地自定义的,各位可以忽略!

另为,有人可能在找 分享应用列表,在此一并说下吧。

获取支持分享的应用的代码:

view plaincopy to clipboardprint?
/**
 * 查询手机内所有支持分享的应用
 * @param context
 * @return
 */ 
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;   

 /**
  * 查询手机内所有支持分享的应用
  * @param context
  * @return
  */
 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。因此获取图片、应用名、包名的方法不一样,如下:

view plaincopy to clipboardprint?
PackageManager pManager = MessageSendActivity.this.getPackageManager(); 
 
/*********************查询手机内所有支持分享的应用*********************/ 
List<ResolveInfo> resolveList  = Utils.getShareApps(MessageSendActivity.this); 
 
for(int i=0;i<resolveList.size();i++) { 
    ResolveInfo resolve = resolveList.get(i); 
    ShareItemInfo shareItem = new ShareItemInfo(); 
    //set Icon  
 shareItem.setIcon(resolve.loadIcon(pManager)); 
    //set Application Name  
    shareItem.setLabel(resolve.loadLabel(pManager).toString()); 
    //set Package Name   
    shareItem.setPackageName(resolve.activityInfo.packageName); 
     

                     PackageManager pManager = MessageSendActivity.this.getPackageManager();
                    
                     /*********************查询手机内所有支持分享的应用*********************/
                     List<ResolveInfo> resolveList  = Utils.getShareApps(MessageSendActivity.this);
                    
                     for(int i=0;i<resolveList.size();i++) {
                      ResolveInfo resolve = resolveList.get(i);
                      ShareItemInfo shareItem = new ShareItemInfo();
                      //set Icon
                      shareItem.setIcon(resolve.loadIcon(pManager));
                      //set Application Name
                      shareItem.setLabel(resolve.loadLabel(pManager).toString());
                      //set Package Name
                      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()

 

 

相关文章
|
Android开发 数据安全/隐私保护
安卓手机修改设备id, 安卓硬改一键新机,手机机型修改(伪装)
提供了完整的设备信息修改功能,包含设备模板配置、基础信息修改、网络信息修改、模拟器检测绕
|
存储 人工智能 文字识别
三款安卓手机word编辑器下载,Microsoft Word,wps office,Word手机版,手机word编辑查看阅读器,PDF转换器apk下载
WPS Office是一款功能强大的办公软件,支持文档编辑、表格处理和演示文稿制作,兼容多种格式并提供丰富的云服务。它具备低内存占用、快速运行的特点,支持跨设备同步与多人协作,内置海量模板及AI辅助功能,如智能写作和PPT自动生成。此外,还可扫描文件、编辑PDF并转换为其他格式,极大提升办公效率,适合手机用户便捷操作。
1363 1
|
前端开发 Java 编译器
当flutter react native 等混开框架-并且用vscode-idea等编译器无法打包apk,打包安卓不成功怎么办-直接用android studio如何打包安卓apk -重要-优雅草卓伊凡
当flutter react native 等混开框架-并且用vscode-idea等编译器无法打包apk,打包安卓不成功怎么办-直接用android studio如何打包安卓apk -重要-优雅草卓伊凡
689 36
当flutter react native 等混开框架-并且用vscode-idea等编译器无法打包apk,打包安卓不成功怎么办-直接用android studio如何打包安卓apk -重要-优雅草卓伊凡
|
Android开发 数据安全/隐私保护 虚拟化
安卓手机远程连接登录Windows服务器教程
安卓手机远程连接登录Windows服务器教程
4144 5
|
安全 搜索推荐 Android开发
Android vs. iOS:解锁智能手机操作系统的奥秘####
【10月更文挑战第21天】 在当今这个数字化时代,智能手机已成为我们生活中不可或缺的伙伴。本文旨在深入浅出地探讨两大主流操作系统——Android与iOS的核心差异、优势及未来趋势,帮助读者更好地理解这两个平台背后的技术哲学和用户体验设计。通过对比分析,揭示它们如何塑造了我们的数字生活方式,并展望未来可能的发展路径。无论您是技术爱好者还是普通用户,这篇文章都将带您走进一个充满创新与可能性的移动世界。 ####
597 3
|
Web App开发 Android开发
利用firefox调试安卓手机端web
该教程详细介绍如何通过Firefox浏览器实现手机与电脑的远程调试。手机端需安装最新版Firefox,并按指定步骤设置完成;电脑端则需安装15版及以上Firefox。设置完成后,通过工具栏中的“远程调试”选项,输入手机IP地址即可连接。连接确认后,即可使用电脑端Firefox调试器调试手机上的Web信息。注意,调试前手机需提前打开目标网页。
1848 2
|
Android开发 iOS开发 UED
安卓与iOS的较量:谁才是智能手机市场的王者?
本文将深入探讨安卓和iOS两大智能手机操作系统之间的竞争关系,分析它们各自的优势和劣势。通过对比两者在市场份额、用户体验、应用生态等方面的表现,我们将揭示出谁才是真正的市场领导者。无论你是安卓粉丝还是iOS忠实用户,这篇文章都将为你提供一些有趣的观点和见解。
|
Android开发 开发者
Android Split APK介绍
【2月更文挑战第5天】
|
XML API Android开发
android S 上 安装apk出现android.os.FileUriExposedException
android S 上 安装apk出现android.os.FileUriExposedException
757 6
|
设计模式 缓存 Java
补齐Android技能树——从AGP构建过程到APK打包过程,安卓rxjava面试
补齐Android技能树——从AGP构建过程到APK打包过程,安卓rxjava面试

热门文章

最新文章