美文网首页android简化开发Kotlin 携程
Android 获取手机已安装的应用列表

Android 获取手机已安装的应用列表

作者: 清朝公主大清正黄旗 | 来源:发表于2022-04-12 11:47 被阅读0次

    1、扫描已安装的应用列表

    var queryIntentActivities = mutableListOf<ResolveInfo>()
            val intent = Intent(Intent.ACTION_MAIN).addCategory(Intent.CATEGORY_LAUNCHER)
            if (android.os.Build.VERSION.SDK_INT >= android.os.Build.VERSION_CODES.M) {
                queryIntentActivities =
                    packageManager.queryIntentActivities(intent, PackageManager.MATCH_ALL)
            } else {
                queryIntentActivities = packageManager.queryIntentActivities(intent, 0)
            }
    

    上面代码中,queryIntentActivities 就是获取的应用列表数据,下面就直接通过遍历获取每个应用的信息了

    queryIntentActivities.forEach {
                bean = AppInfoBean(
                    icon = it.loadIcon(packageManager),
                    appName = it.loadLabel(packageManager).toString(),
                    appPackageName = it.activityInfo.applicationInfo.packageName
                )
                appBeanList.add(bean!!)
            }
    

    上面 AppInfoBean 是自己定义的实体bean 里面有应用的名称,包名,还有Drawable 类型的应用icon
    appBeanList 是定义的list变量,

    注意:这里提个醒,也是我遇到的一个小问题,在扫描所有应用的时候,Intent的action 是:Intent.ACTION_MAIN 切记,否则一个也查不到,
    还有,可能你通过上面获取的应用列表只有几个,不全,此时,你需要添加一个权限:

    <uses-permission
            android:name="android.permission.QUERY_ALL_PACKAGES"
            tools:ignore="QueryAllPackagesPermission" />
    

    有了上面这个权限,你才能获取到所有的应用

    2、通过包名,查询对应应用的图标icon

        /**
         * 根据应用包名,查应用的icon图
         */
        private fun loadAppIconByPackageName(packageName:String,listener:(icon:Drawable) -> Unit){
            try {
                if (packageManager == null){
                    packageManager = BaseApp.myApp.packageManager
                }
                val packageInfo = packageManager?.getPackageInfo(
                    packageName,
                    PackageManager.GET_ACTIVITIES
                )
                packageInfo?.applicationInfo?.loadIcon(packageManager)?.let { listener.invoke(it) }
            } catch (e: Exception) {
                listener.invoke(BaseApp.myApp.resources.getDrawable(R.mipmap.ic_launcher))
            }
        }
    

    这个就简单了,获取当前的packageManager 就可以进行获取对应的icon了,不过这个跟上面获取应用一样,也需要权限和否则可能也会遇到扫描不到的问题哦。

    3、通过包名获取对应应用的启动页的全类名

    /**
      * 通过包名获取app的入口activity
      */
     @SuppressLint("WrongConstant")
     fun getAppEnter(context: Context, packageName: String): String {
         var mainAct = ""
         try {
             val intent = Intent().apply {
                 action = Intent.ACTION_MAIN
                 addCategory(Intent.CATEGORY_LAUNCHER)
             }
             val list =
                 context.packageManager.queryIntentActivities(intent, PackageManager.GET_ACTIVITIES)
    
             list.forEach {
                 if (TextUtils.equals(it.activityInfo.packageName, packageName)) {
                     mainAct = it.activityInfo.name
                 }
             }
         } catch (ex: Exception) {
    
         } finally {
             return mainAct
         }
     }
    

    这个需要注意的事项和第一个获取应用列表一样,其他的都没什么需要注意的了。

    相关文章

      网友评论

        本文标题:Android 获取手机已安装的应用列表

        本文链接:https://www.haomeiwen.com/subject/tvwgsrtx.html