context.getSystemService(UserManager.class)在装有华为手机的Android 9上返回null

时间:2019-12-19 08:33:47

标签: android androidx android-9.0-pie huawei

有人知道运行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.access$2000 (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)

任何解决方法?

2 个答案:

答案 0 :(得分:1)

您可以尝试用服务名称替换服务类吗?

public static boolean isUserUnlocked(@NonNull Context context) {
    if (Build.VERSION.SDK_INT >= 24) {
        return ((UserManager) context.getSystemService(Context.USER_SERVICE)).isUserUnlocked();
    } else {
        return true;
    }
}

答案 1 :(得分:0)

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