android - context.getSystemService(UserManager.class) 在 Android 9 华为手机上返回 null

标签 android androidx android-9.0-pie huawei-mobile-services

有人知道运行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)

有什么解决办法吗?

最佳答案

根据 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 - context.getSystemService(UserManager.class) 在 Android 9 华为手机上返回 null,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59405896/

相关文章:

java - 如何检查 WiFi 扫描限制是否启用或禁用?

Android 在 ImageView 中创建一个矩形

android - python android 脚本在 AVD 设备中崩溃

android - 如何检查 ROOM 数据库中的记录是否被删除?

android - 如何处理低于 28 的 android API 中的缺口(显示切口)?

Android P 非 SDK 接口(interface)限制适用于 android.support 和/或 androidx

android - 为什么 Android 的 ImageDecoder(在 Pie 中引入)没有公共(public)的 InputStreamSource?

java - 如何等待异步任务返回

java - 适配器重复行

java - IllegalStateException:WorkManager 已经初始化