Как перенести общие префы из приложения Instant в полноценное приложение - PullRequest
0 голосов
/ 10 января 2019

Я знаю, что мы можем передать данные из мгновенного приложения в полное приложение, используя API хранилища Google Instant, как упоминалось здесь .

Для устройств под управлением ОС версии ниже 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, он не может найти его. Каково полное имя файла и есть ли лучший способ перенести мои общие данные pref из мгновенного приложения в установленное приложение.

1 Ответ

0 голосов
/ 07 февраля 2019

Потратив несколько часов, я смог заставить его работать, но потом я нашел гораздо лучший и простой способ сделать это. У Google также есть API cookie, который можно использовать для обмена данными из мгновенного приложения с полным приложением при обновлении пользователя.

Документация: 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.

Надеюсь, это кому-нибудь поможет.

...