如何将共享偏好从Instant应用转移到完整应用

时间:2019-01-10 15:42:17

标签: android zip android-instant-apps

我知道我们可以使用here所述的Google Instant的存储API将数据从即时应用程序传输到完整应用程序。

对于运行低于Oreo的OS版本的设备,我尝试按以下方式读取数据:

 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文件时,无法找到它。文件的全名是什么,还有什么更好的方法可以将共享的偏好数据从即时应用程序传输到已安装的应用程序。

1 个答案:

答案 0 :(得分:0)

花了几个小时后,我能够使它工作,但是后来我发现了一种更好,更轻松的方法。 Google还具有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所必需的。它适用于OS版本大于或等于8的设备以及OS版本小于8的设备。

希望这对某人有帮助。