Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/181.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/7/elixir/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直接引导问题_Android - Fatal编程技术网

从凭据切换到设备存储时出现Android直接引导问题

从凭据切换到设备存储时出现Android直接引导问题,android,Android,我已经做了一个应用程序来测试直接启动。一个仅存储五个首选项和引导接收器的活动 MainActivity.java mSharedPreferences = getSharedPreferences("myapp_preferences", Context.MODE_PRIVATE); SharedPreferences.Editor editor = mSharedPreferences.edit(); editor.putString("pref1", "someStringPref1");

我已经做了一个应用程序来测试直接启动。一个仅存储五个首选项和引导接收器的活动

MainActivity.java
mSharedPreferences = getSharedPreferences("myapp_preferences", Context.MODE_PRIVATE);
SharedPreferences.Editor editor = mSharedPreferences.edit();
editor.putString("pref1", "someStringPref1");
editor.putString("pref2", "someStringPref2");
editor.putString("pref3", "someStringPref3");
editor.putString("pref4", "someStringPref4");
editor.putString("pref5", "someStringPref5");
editor.commit();

final Map<String, ?> map = mSharedPreferences.getAll();
Log.d("BootReceiver", "map size: " + map.size());
为什么无法将首选项移动到设备上下文(映射大小:0)?API错误?我的设备有缺陷(文件加密已打开,Nexus 5x,从今年10月开始有补丁)?或者很可能,我遗漏了什么

PS缺少android directboot标记

更新 Nexus 6p具有相同的性能,适用于7.0(使用
compileSdkVersion 24
编译的应用程序)和7.1.1(使用
compileSdkVersion 24和25
)操作系统版本

更新#2

if (Intent.ACTION_LOCKED_BOOT_COMPLETED.equals(action)) {
    unlocked = false;
} else if (Intent.ACTION_BOOT_COMPLETED.equals(action)) {
    unlocked = true;
}

据我所知,您将pref保存到普通的用户锁定存储中,并试图在引导时将其从那里移动到设备锁定存储中。这将不起作用,因为在启动时用户存储被锁定。 您需要将共享pref直接保存到设备存储上下文中,并且仅在从旧设备升级的情况下使用迁移过程


有关直接引导的正确处理方法,请参见本节。

据我所知,您将pref保存到正常的用户锁定存储中,并尝试在引导时将其从那里移动到设备锁定存储中。这将不起作用,因为在启动时用户存储被锁定。 您需要将共享pref直接保存到设备存储上下文中,并且仅在从旧设备升级的情况下使用迁移过程


有关直接引导的正确处理方法,请参阅此部分。

直接引导仍处于预发布状态,因此我没有给予太多关注。什么是未锁定的?请参阅我的更新2。你怎么知道它是预发布的?官方页面上没有这样的信息。文件加密是预发布IIRC,这意味着直接引导是通过扩展预发布的。我同意戈内普的观点。我认为这个想法是将数据保存在一个位置,迁移是一次性的。一个子问题,你知道如何检测FBE吗?其中一个演示了如何检测FDE,但我只想在FBE打开的情况下对N台设备进行迁移。我还没有玩过它,我也不记得有一种检测机制。很抱歉Direct boot仍处于预发布状态,因此我没有给予太多关注。什么是未锁定的?请参阅我的更新2。你怎么知道它是预发布的?官方页面上没有这样的信息。文件加密是预发布IIRC,这意味着直接引导是通过扩展预发布的。我同意戈内普的观点。我认为这个想法是将数据保存在一个位置,迁移是一次性的。一个子问题,你知道如何检测FBE吗?其中一个演示了如何检测FDE,但我只想在FBE打开的情况下对N台设备进行迁移。我还没有玩过它,我也不记得有一种检测机制。很抱歉我不确定永久存储到设备保护的存储器是否合适,但这个答案肯定显示了我在代码中犯的错误。我不确定永久存储到设备保护的存储器是否合适,但这个答案肯定显示了我在代码中犯的错误。
// activity started, five prefs successfully added
map size: 5
// device restarted, still unlocked -> direct boot mode
intent action: android.intent.action.LOCKED_BOOT_COMPLETED
map size: 0
// device unlocked (PIN screen lock used) -> credential encrypted storage
intent action: android.intent.action.BOOT_COMPLETED
map size: 5
if (Intent.ACTION_LOCKED_BOOT_COMPLETED.equals(action)) {
    unlocked = false;
} else if (Intent.ACTION_BOOT_COMPLETED.equals(action)) {
    unlocked = true;
}