业务需要获取用户的已安装的应用列表进行上传。
但是获取应用安装列表的权限现在属于敏感权限,即QUERY_ALL_PACKAGES权限。
实现步骤:
1.Manifest文件里进行配置
<queries>
<intent>
<action android:name="android.intent.action.MAIN" />
</intent>
</queries>
2.实现代码 AppUtils.kt
package com.uz.cashloanuzi.grab
import android.annotation.SuppressLint
import android.content.pm.ApplicationInfo
import android.content.pm.PackageInfo
import android.content.pm.PackageManager
import android.os.Build
import com.uz.cashloanuzi.base.BaseApplication
object AppUtils {
@SuppressLint("QueryPermissionsNeeded")
fun getAppsInfo(): List<AppInfo?> {
val list: MutableList<AppInfo?> =
ArrayList()
val pm: PackageManager = BaseApplication.application?.packageManager ?: return list
val installedPackages = pm.getInstalledPackages(0)
for (pi in installedPackages) {
val ai: AppInfo = getBean(pm, pi) ?: continue
list.add(ai)
}
return list
}
private fun getBean(
pm: PackageManager,
pi: PackageInfo?
): AppInfo? {
if (pi == null) return null
val versionName = pi.versionName
val packageName = pi.packageName
val ai = pi.applicationInfo
?: return AppInfo(
packageName,
"",
1,
1,
"",
false
)
val name = ai.loadLabel(pm).toString()
val installTime: Long =
pi.firstInstallTime
val updateTime: Long =
pi.lastUpdateTime
val isSystem = (ApplicationInfo.FLAG_SYSTEM and ai.flags) != 0
return AppInfo(
packageName,
name,
installTime,
updateTime,
versionName,
isSystem
)
}
}
data class AppInfo(
var packageName: String?,
var appName: String?,
var firstInstallTime: Long?,
var lastUpdateTime: Long?,
var versionName: String?,
var system: Boolean
) {
override fun toString(): String {
return """{
pkg name: $packageName
app name: $appName
firstTime : $firstInstallTime
lastUpdateTime : $lastUpdateTime
versionName : $versionName
is system: $system
}"""
}
}
这样就是获取了安装列表的数据。