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()...