当我们使用getInstalledPackages(0)方法来获取其他app的安装信息,比如app图标,名称等等.
App会有一定概率出现DeadSystemException问题,会偶尔出现报错和crash错误
context?.packageManager?.getInstalledPackages(0)?.forEach {
it?.let { p ->
if (p.packageName == GOOGLE_MAP_PACKAGE_NAME) {
googleMapIcon.setImageDrawable(p.applicationInfo.loadIcon(context?.packageManager))
googleMapText.text =
context?.packageManager?.getApplicationLabel(p.applicationInfo)
.toString()
}
if (p.packageName == WAZE_PACKAGE_NAME) {
weizhiMapIcon.setImageDrawable(p.applicationInfo.loadIcon(context?.packageManager))
weizhiText.text =
context?.packageManager?.getApplicationLabel(p.applicationInfo)
.toString()
}
}
}
报错信息如下:
Fatal Exception: java.lang.RuntimeException: android.os.DeadSystemException
at android.app.ApplicationPackageManager.getInstalledPackagesAsUser(ApplicationPackageManager.java:1031)
at android.app.ApplicationPackageManager.getInstalledPackages(ApplicationPackageManager.java:1016)
at com.xxx.xxx.app_common.utils.NavigateSelectUtils$NavigateDialog.onCreateView(NavigateSelectUtils.java:458)
at androidx.fragment.app.Fragment.performCreateView(Fragment.java:2963)
at androidx.fragment.app.DialogFragment.performCreateView(DialogFragment.java:489)
at androidx.fragment.app.FragmentStateManager.createView(FragmentStateManager.java:518)
at androidx.fragment.app.FragmentStateManager.moveToExpectedState(FragmentStateManager.java:282)
at androidx.fragment.app.FragmentManager.executeOpsTogether(FragmentManager.java:2189)
at androidx.fragment.app.FragmentManager.removeRedundantOperationsAndExecute(FragmentManager.java:2100)
at androidx.fragment.app.FragmentManager.execPendingActions(FragmentManager.java:2002)
at androidx.fragment.app.FragmentManager$5.run(FragmentManager.java:524)
at android.os.Handler.handleCallback(Handler.java:938)
at android.os.Handler.dispatchMessage(Handler.java:99)
at android.os.Looper.loop(Looper.java:250)
at android.app.ActivityThread.main(ActivityThread.java:7844)
at java.lang.reflect.Method.invoke(Method.java)
at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:592)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:958)
根据方法栈调用信息,报错的地点很明显是运行时异常
解决方案:使用getApplicationInfo方法去获取app信息,一方面可以捕获异常,一方面可以获取到app的信息
try {
context?.packageManager?.getApplicationInfo(
GOOGLE_MAP_PACKAGE_NAME,
PackageManager.GET_META_DATA
)?.run {
googleMapIcon.setImageDrawable(this.loadIcon(context?.packageManager))
googleMapText.text =
context?.packageManager?.getApplicationLabel(this)
.toString()
}
context?.packageManager?.getApplicationInfo(
WAZE_PACKAGE_NAME,
PackageManager.GET_META_DATA
)?.run {
weizhiMapIcon.setImageDrawable(this.loadIcon(context?.packageManager))
weizhiText.text =
context?.packageManager?.getApplicationLabel(this)
.toString()
}
} catch (e: PackageManager.NameNotFoundException) {
e.printStackTrace()
}