Моя система поддерживает многопользовательскую функцию и поддерживает функцию очистки данных для гостевых пользователей.
Я использовал «wipeguestsession» для очистки данных. https://cs.android.com/android/platform/superproject/+/master: рамки / базы / пакеты / SystemUI / src / com / android / systemui / GuestResumeSessionReceiver.java; l = 95? Q = wipeguest & ss = android% 2Fplatform% 2Fsuperproject
и затем мое устройство получило эту ошибку.
Caused by: java.lang.NullPointerException: Attempt to read from field 'java.util.Map com.android.server.tv.TvInputManagerService$UserState.sessionStateMap' on a null object reference
Этот TvInputManagerService зарегистрировал два действия: Intent.ACTION_USER_SWITCHED и Intent.ACTION_USER_REMOVED. Если этот сервис получает userRemoved и сначала очищает UserState, то получает userSwitched. Если он использует ранее очищенное UserState, возникнет ошибка нулевого указателя.
private void removeUser(int userId) {
synchronized (mLock) {
UserState userState = mUserStates.get(userId);
if (userState == null) {
return;
}
// Release all created sessions.
for (SessionState state : userState.sessionStateMap.values()) {
if (state.session != null) {
try {
state.session.release();
} catch (RemoteException e) {
Slog.e(TAG, "error in release", e);
}
}
}
userState.sessionStateMap.clear();
// Unregister all callbacks and unbind all services.
for (ServiceState serviceState : userState.serviceStateMap.values()) {
if (serviceState.service != null) {
if (serviceState.callback != null) {
try {
serviceState.service.unregisterCallback(serviceState.callback);
} catch (RemoteException e) {
Slog.e(TAG, "error in unregisterCallback", e);
}
}
mContext.unbindService(serviceState.connection);
}
}
userState.serviceStateMap.clear();
// Clear everything else.
userState.inputMap.clear();
userState.packageSet.clear();
userState.contentRatingSystemList.clear();
userState.clientStateMap.clear();
userState.mCallbacks.kill();
userState.mainSessionToken = null;
mUserStates.remove(userId);
}
}
private void switchUser(int userId) {
synchronized (mLock) {
if (mCurrentUserId == userId) {
return;
}
UserState userState = mUserStates.get(mCurrentUserId);
List<SessionState> sessionStatesToRelease = new ArrayList<>();
for (SessionState sessionState : userState.sessionStateMap.values()) {
if (sessionState.session != null && !sessionState.isRecordingSession) {
sessionStatesToRelease.add(sessionState);
}
}
https://cs.android.com/android/platform/superproject/+/master: frameworks / base / services / core / java / com / android / server / tv / TvInputManagerService .java; l = 378? q = TvInputManager% 20switchUser & ss = android% 2Fplatform% 2Fsuperproject
Я не уверен, является ли это моей проблемой или Android, поэтому мое текущее решение - проверить это объект. Если это Null, пропустите его.
Кто-нибудь сталкивался с этой проблемой?