android - 如何将共享首选项从即时应用程序转移到完整应用程序
问题描述
我知道我们可以使用此处提到的 Google Instant 的 Storage api 将数据从即时应用程序传输到完整应用程序。
对于运行 OS 版本低于 Oreo 的设备,我尝试按如下方式读取数据:
public void getInstantAppData(final Activity activity, final InstantAppDataListener listener) {
InstantApps.getInstantAppsClient(activity)
.getInstantAppData()
.addOnCompleteListener(new OnCompleteListener<ParcelFileDescriptor>() {
@Override
public void onComplete(@NonNull Task<ParcelFileDescriptor> task) {
try {
FileInputStream inputStream = new FileInputStream(task.getResult().getFileDescriptor());
BufferedInputStream bufferedInputStream = new BufferedInputStream(inputStream);
ZipInputStream zipInputStream = new ZipInputStream(bufferedInputStream);
ZipEntry zipEntry;
while ((zipEntry = zipInputStream.getNextEntry()) != null) {
Log.i("Instant-app", zipEntry.getName());
if (zipEntry.getName().equals("shared_prefs/")) {
extractSharedPrefsFromZip(activity, zipEntry);
}
}
} catch (IOException e) {
e.printStackTrace();
}
}
});
}
private void extractSharedPrefsFromZip(Activity activity, ZipEntry zipEntry) throws IOException {
File file = new File(activity.getApplicationContext().getFilesDir() + "/shared_prefs.vlp");
mkdirs(file);
FileInputStream fis = new FileInputStream(zipEntry.getName());
BufferedInputStream bis = new BufferedInputStream(fis);
ZipInputStream stream = new ZipInputStream(bis);
byte[] buffer = new byte[2048];
FileOutputStream fos = new FileOutputStream(file);
BufferedOutputStream bos = new BufferedOutputStream(fos, buffer.length);
int length;
while ((length = stream.read(buffer)) > 0) {
bos.write(buffer, 0, length);
}
}
但是我收到一个错误Method threw 'java.io.FileNotFoundException' exception.
基本上当我试图读取 shared_pref 文件时它无法找到它。文件的全名是什么,有没有更好的方法将我的共享首选项数据从即时应用程序传输到已安装的应用程序。
解决方案
花了几个小时后,我能够让它工作,但后来我发现了一种更好、更简单的方法来做到这一点。谷歌还有一个 cookie api,可用于在用户升级时将数据从即时应用程序共享到您的完整应用程序。
示例:https ://github.com/googlesamples/android-instant-apps/tree/master/cookie-api
我更喜欢这个,因为它更干净,易于实现,但最重要的是,您不必将可安装应用程序的目标沙盒版本增加到 2,如果您使用 Storage API,则需要这样做。它适用于操作系统版本大于或等于 8 的设备以及操作系统版本小于 8 的设备。
希望这可以帮助某人。
推荐阅读
- spring-boot - 如何让 Hystrix Dashboard 在 Spring Boot Admin 2.x 中再次工作
- html - 如何在 React JS 中不使用 jquery 插件使 html 地图响应
- ios - Alamofire 请求未在 swift 5 中执行
- php - 将条件参数传递给 larave 中的 Eager Loading 以错误结束
- python - 如何将一行python代码分配给变量
- date - 模拟更长的时间
- php - 在for循环php中创建10-9-8-7-6-5-4-3-2-1
- php - codeigniter:试图从图像名称中删除“&”符号,但没有发生,该 getimagesize() 的 bcoz 给出错误
- angular - 每次单击按钮时添加新按钮,并在角度 6 中添加新颜色的按钮
- reactjs - 如何解决提供给`ForwardRef(TextField)`的警告值`inherit`的无效道具`color`,预期为[“primary”,“secondary”]之一