context.getSystemService(UserManager.class) returns 空 Android 9 华为手机
context.getSystemService(UserManager.class) returns null on Android 9 with Huawei phones
有没有人知道华为手机的问题运行 Android 9. 访问时一直返回null :
context.getSystemService(UserManager.class)
问题是很多 API 都依赖它,就像 androidx.core 中的 UserManagerCompat 一样:
public static boolean isUserUnlocked(@NonNull Context context) {
if (Build.VERSION.SDK_INT >= 24) {
return context.getSystemService(UserManager.class).isUserUnlocked();
} else {
return true;
}
}
这导致:
java.lang.RuntimeException:
at android.app.ActivityThread.handleBindApplication (ActivityThread.java:6737)
at android.app.ActivityThread.access00 (ActivityThread.java:273)
at android.app.ActivityThread$H.handleMessage (ActivityThread.java:2020)
at android.os.Handler.dispatchMessage (Handler.java:112)
at android.os.Looper.loop (Looper.java:216)
at android.app.ActivityThread.main (ActivityThread.java:7625)
at java.lang.reflect.Method.invoke (Method.java)
at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run (RuntimeInit.java:524)
at com.android.internal.os.WebViewZygoteInit.main (WebViewZygoteInit.java:171)
at java.lang.reflect.Method.invoke (Method.java)
at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run (RuntimeInit.java:524)
at com.android.internal.os.ZygoteInit.main (ZygoteInit.java:987)
Caused by: java.lang.NullPointerException:
at androidx.core.os.UserManagerCompat.isUserUnlocked (UserManagerCompat.java:1)
at com.google.firebase.FirebaseApp.initializeAllApis (FirebaseApp.java:1)
at com.google.firebase.FirebaseApp.initializeApp (FirebaseApp.java:4)
at com.google.firebase.FirebaseApp.initializeApp (FirebaseApp.java:1)
at com.google.firebase.FirebaseApp.initializeApp (FirebaseApp.java:1)
任何解决方法?
您可以尝试用服务名称替换服务 class :
public static boolean isUserUnlocked(@NonNull Context context) {
if (Build.VERSION.SDK_INT >= 24) {
return ((UserManager) context.getSystemService(Context.USER_SERVICE)).isUserUnlocked();
} else {
return true;
}
}
根据 Andris 的回答,华为似乎正确回应了:
Context.getSystemService(Context.USER_SERVICE)
而不是:
Context.getSystemService(UserManager.class)
所以我不得不重写 Application#getSystemServiceName(Class<?> clazz)
以使 UserManagerCompat.isUserUnlocked(Context context)
在有问题的华为手机上工作 :
@Override
public String getSystemServiceName(Class<?> serviceClass) {
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.P
&& "huawei".equalsIgnoreCase(Build.MANUFACTURER)) {
String systemServiceName = super.getSystemServiceName(serviceClass);
if (systemServiceName == null && UserManager.class.equals(serviceClass)) {
systemServiceName = Context.USER_SERVICE;
}
return systemServiceName;
}
return super.getSystemServiceName(serviceClass);
}
这是可能的,因为 FirebaseApp 在可用时使用 Context#getApplicationContext()
...
有没有人知道华为手机的问题运行 Android 9. 访问时一直返回null :
context.getSystemService(UserManager.class)
问题是很多 API 都依赖它,就像 androidx.core 中的 UserManagerCompat 一样:
public static boolean isUserUnlocked(@NonNull Context context) {
if (Build.VERSION.SDK_INT >= 24) {
return context.getSystemService(UserManager.class).isUserUnlocked();
} else {
return true;
}
}
这导致:
java.lang.RuntimeException:
at android.app.ActivityThread.handleBindApplication (ActivityThread.java:6737)
at android.app.ActivityThread.access00 (ActivityThread.java:273)
at android.app.ActivityThread$H.handleMessage (ActivityThread.java:2020)
at android.os.Handler.dispatchMessage (Handler.java:112)
at android.os.Looper.loop (Looper.java:216)
at android.app.ActivityThread.main (ActivityThread.java:7625)
at java.lang.reflect.Method.invoke (Method.java)
at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run (RuntimeInit.java:524)
at com.android.internal.os.WebViewZygoteInit.main (WebViewZygoteInit.java:171)
at java.lang.reflect.Method.invoke (Method.java)
at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run (RuntimeInit.java:524)
at com.android.internal.os.ZygoteInit.main (ZygoteInit.java:987)
Caused by: java.lang.NullPointerException:
at androidx.core.os.UserManagerCompat.isUserUnlocked (UserManagerCompat.java:1)
at com.google.firebase.FirebaseApp.initializeAllApis (FirebaseApp.java:1)
at com.google.firebase.FirebaseApp.initializeApp (FirebaseApp.java:4)
at com.google.firebase.FirebaseApp.initializeApp (FirebaseApp.java:1)
at com.google.firebase.FirebaseApp.initializeApp (FirebaseApp.java:1)
任何解决方法?
您可以尝试用服务名称替换服务 class :
public static boolean isUserUnlocked(@NonNull Context context) {
if (Build.VERSION.SDK_INT >= 24) {
return ((UserManager) context.getSystemService(Context.USER_SERVICE)).isUserUnlocked();
} else {
return true;
}
}
根据 Andris 的回答,华为似乎正确回应了:
Context.getSystemService(Context.USER_SERVICE)
而不是:
Context.getSystemService(UserManager.class)
所以我不得不重写 Application#getSystemServiceName(Class<?> clazz)
以使 UserManagerCompat.isUserUnlocked(Context context)
在有问题的华为手机上工作 :
@Override
public String getSystemServiceName(Class<?> serviceClass) {
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.P
&& "huawei".equalsIgnoreCase(Build.MANUFACTURER)) {
String systemServiceName = super.getSystemServiceName(serviceClass);
if (systemServiceName == null && UserManager.class.equals(serviceClass)) {
systemServiceName = Context.USER_SERVICE;
}
return systemServiceName;
}
return super.getSystemServiceName(serviceClass);
}
这是可能的,因为 FirebaseApp 在可用时使用 Context#getApplicationContext()
...