我注意到我的一些用户遇到了这个异常。我不知道如何重现它,我只有关于 Crashlytics 的报告。似乎深入谷歌的代码。在数千名使用此代码的人中,只有 39 人有例外。
知道可能出了什么问题吗?
Fatal Exception: java.lang.NullPointerException: Attempt to invoke interface method 'java.util.Iterator java.lang.Iterable.iterator()' on a null object reference
at android.app.ApplicationPackageManager.getUserIfProfile(ApplicationPackageManager.java:2141)
at android.app.ApplicationPackageManager.getUserBadgeForDensity(ApplicationPackageManager.java:997)
at android.app.Notification$Builder.getProfileBadgeDrawable(Notification.java:2877)
at android.app.Notification$Builder.hasThreeLines(Notification.java:3092)
at android.app.Notification$Builder.build(Notification.java:3646)
at android.support.v4.app.NotificationCompatApi21$Builder.build(NotificationCompatApi21.java:136)
at android.support.v7.app.NotificationCompat$LollipopExtender.build(NotificationCompat.java:504)
at android.support.v4.app.NotificationCompat$NotificationCompatImplApi21.build(NotificationCompat.java:835)
at android.support.v4.app.NotificationCompat$Builder.build(NotificationCompat.java:1752)
at mycode.startNotification(mycode.java:361)
谢谢。
ApplicationPackageManager.java
private UserInfo getUserIfProfile(int userHandle) {
List<UserInfo> userProfiles = getUserManager().getProfiles(UserHandle.myUserId());
for (UserInfo user : userProfiles) {
if (user.id == userHandle) {
return user;
}
}
return null;
}
和
public List<UserInfo> getProfiles(int userHandle) {
try {
return mService.getProfiles(userHandle, false /* enabledOnly */);
} catch (RemoteException re) {
Log.w(TAG, "Could not get user list", re);
return null;
}
}
因此,如果 AIDL 请求出现问题,或者用户的配置文件被禁用,您将在 ApplicationPackageManager 中.java代码中使用 NPE。我认为这种情况是不可能防止的,我建议你将通知创建包装在try{}catch块中