首页 > 解决方案 > 如何将共享首选项从即时应用程序转移到完整应用程序

问题描述

我知道我们可以使用此处提到的 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 文件时它无法找到它。文件的全名是什么,有没有更好的方法将我的共享首选项数据从即时应用程序传输到已安装的应用程序。

标签: androidzipandroid-instant-apps

解决方案


花了几个小时后,我能够让它工作,但后来我发现了一种更好、更简单的方法来做到这一点。谷歌还有一个 cookie api,可用于在用户升级时将数据从即时应用程序共享到您的完整应用程序。

文档:https://developers.google.com/android/reference/com/google/android/gms/instantapps/PackageManagerCompat#setInstantAppCookie(byte%5B%5D)

示例:https ://github.com/googlesamples/android-instant-apps/tree/master/cookie-api

我更喜欢这个,因为它更干净,易于实现,但最重要的是,您不必将可安装应用程序的目标沙盒版本增加到 2,如果您使用 Storage API,则需要这样做。它适用于操作系统版本大于或等于 8 的设备以及操作系统版本小于 8 的设备。

希望这可以帮助某人。


推荐阅读