Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/templates/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/url/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Android 仅饼图:SharedReferences非法状态异常_Android - Fatal编程技术网

Android 仅饼图:SharedReferences非法状态异常

Android 仅饼图:SharedReferences非法状态异常,android,Android,当我们试图初始化共享首选项单例类时,我们得到了一个非法的StageException,但我不知道是什么导致了它 这里有人能告诉我是什么原因造成的吗 注意:这只发生在Pie上 以下是来自Google Play控制台的报告(crash不会在Crashlytics中显示): java.lang.RuntimeException: 位于android.app.ActivityThread.handleBindApplication(ActivityThread.java:5876) 在android.a

当我们试图初始化共享首选项单例类时,我们得到了一个非法的StageException,但我不知道是什么导致了它

这里有人能告诉我是什么原因造成的吗

注意:这只发生在Pie上

以下是来自Google Play控制台的报告(crash不会在Crashlytics中显示):

java.lang.RuntimeException:
位于android.app.ActivityThread.handleBindApplication(ActivityThread.java:5876)
在android.app.ActivityThread.access$1100(ActivityThread.java:199)
在android.app.ActivityThread$H.handleMessage(ActivityThread.java:1650)
位于android.os.Handler.dispatchMessage(Handler.java:106)
在android.os.Looper.loop(Looper.java:193)
位于android.app.ActivityThread.main(ActivityThread.java:6669)
位于java.lang.reflect.Method.invoke(本机方法)
位于com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:493)
位于com.android.internal.os.ZygoteInit.main(ZygoteInit.java:858)
原因:java.lang.IllegalStateException:
位于android.app.ContextImpl.getSharedReferences(ContextImpl.java:419)
位于android.app.ContextImpl.getSharedReferences(ContextImpl.java:404)
位于android.content.ContextWrapper.getSharedReferences(ContextWrapper.java:174)
请访问com.nbc.news.utils.SharedReferences。(SharedReferences.java:27)
访问com.nbc.news.utils.SharedReferences.init(SharedReferences.java:44)
在com.nbc.news.NbcNews.onCreate上(NbcNews.java:122)
位于android.app.Instrumentation.callApplicationOnCreate(Instrumentation.java:1154)
位于android.app.ActivityThread.handleBindApplication(ActivityThread.java:5871)
以下是初始化代码:

private android.content.SharedPreferences sharedPreferences;

    private static SharedPreferences instance;

    private SharedPreferences(Context context) {
        Context appContext = context.getApplicationContext();

        sharedPreferences = appContext.getSharedPreferences(context.getString(R.string.database_name), Context.MODE_PRIVATE); // <- this is line #27
    }

    public android.content.SharedPreferences getPreference(){
        return sharedPreferences;
    }

    public static SharedPreferences getInstance() {
        if (instance == null) {
            throw new RuntimeException("SharedPreferences must be initialized with context prior to use");
        }

        return instance;
    }

    public static void init(Context context) {
        if (instance == null) {
            instance = new SharedPreferences(context); // <- this is line #44
        }
    }
private android.content.SharedReferences SharedReferences;
私有静态SharedReferences实例;
私有共享引用(上下文){
Context-appContext=Context.getApplicationContext();

SharedReferences=appContext.GetSharedReferences(context.getString(R.string.database_name),context.MODE_PRIVATE);//我只找到了一个或两个可能有用的拼图块:有两个
IllegalStateException
s,其中一个来自第426-454行中的方法
GetSharedReferences()

“在用户解锁之前,凭据加密存储中的SharedReference不可用”

IllegalStateException
if
块抛出,该块仅在目标SDK版本为Oreo或更高版本时执行

if (getApplicationInfo().targetSdkVersion >= android.os.Build.VERSION_CODES.O) {
    if (isCredentialProtectedStorage()
         && 
        !getSystemService(UserManager.class).isUserUnlockingOrUnlocked(UserHandle.myUserId())) {

        throw new IllegalStateException("SharedPreferences in credential encrypted "
                                + "storage are not available until after user is unlocked");
     }
} 
在web上搜索isCredentialProtectedStorage()
使我找到了


由于我不知道你的应用程序工作流程的详细信息,我只能建议你确保该应用程序在设备被锁定时不会尝试访问安全文件。

你必须在
锁定启动完成后
启动完成前尝试访问
共享参考
这是努加特以来不允许的API 24,除非您将首选项迁移到受设备保护的存储

此处有2个选项:

  • 从广播接收器中删除
    LOCKED\u BOOT\u COMPLETED
    操作和
    android:directBootAware
    标志。这样,您的应用程序将等待
    BOOT\u COMPLETED
    (当用户解锁设备时),然后再尝试访问
    SharedReferences
  • 或者,如果您确实需要在
    LOCKED\u BOOT\u COMPLETED
    之后和
    BOOT\u COMPLETED
    之前访问
    SharedReferences
    ,请确保在调用
    GetSharedReferences()
    时将首选项迁移到设备保护的存储并使用设备保护的存储上下文

有关官方文档中第二个选项的更多详细信息:

尝试将应用程序中心初始化从应用程序类移动到MainActivity。这将对您有所帮助。只有在应用程序准备就绪(启动完成)后,我们才能调用Sharepreference.

感谢您的帮助,为我指明了正确的方向!我设置了一个BroadcastReceiver,用于侦听BOOT_COMPLETED&LOCKED_BOOT_COMPLETED事件,并按照Lint提示添加了“directBootAware=true”当牛轧糖面世时,我从未怀疑偏好异常实际上是由所有DirectBoot的废话造成的。因此,添加“directBootAware=true”in application tag解决了这个问题?对于Android OS 8.0、8.1和9.0,我们也面临同样的问题。这些OS版本似乎有限制/保护。对此有什么发现吗?我们如何避免这种情况?@venkat-如果我正确理解MandisaW的评论,使用此属性会导致他们的操作系统出现异常app@VrajeshHirani-对不起,但我没有关于这方面的任何其他信息。但看起来新的行为“如预期的那样”,因此我想我们必须更改应用程序的工作流程以应对它。您找到解决方案了吗this@hasan_shaikh不幸的是没有。我们不得不改变逻辑,只运行一次解锁
if (getApplicationInfo().targetSdkVersion >= android.os.Build.VERSION_CODES.O) {
    if (isCredentialProtectedStorage()
         && 
        !getSystemService(UserManager.class).isUserUnlockingOrUnlocked(UserHandle.myUserId())) {

        throw new IllegalStateException("SharedPreferences in credential encrypted "
                                + "storage are not available until after user is unlocked");
     }
}