获取系统内所有的应用方法还是比较简单的,但是因为系统版本差异,有几个地方要注意的。
按照Android SDK的文档来说,获取应用列表非常简单,PackageManager
类直接有getInstalledPackages
方法可以用,但是在低版本上使用该API,当安装应用很多的时候,返回的列表会溢出,ISSUE,所以自己想出了个兼容性方案:
fun PackageManager.getInstalledPackagesAppCompat(flags: Int): List<PackageInfo> {
val list = ArrayList<PackageInfo>()
var bufferedReader: BufferedReader? = null
try {
val process = Runtime.getRuntime().exec("pm list packages")
bufferedReader = BufferedReader(InputStreamReader(process.inputStream))
var str: String?
do {
str = bufferedReader.readLine()
if (str == null) break
val packageName = str.substring(str.indexOf(':') + 1);
val packageInfo = this.getPackageInfo(packageName, flags)
list.add(packageInfo)
} while (str != null)
process.waitFor();
} catch(ex: IOException) {
/* Do nothing */
} finally {
try {
bufferedReader?.close()
} catch(ex: IOException) {
/* Do nothing */
}
}
return list
}