如何将共享首选项从即时应用程序转移到完整应用程序

2023-12-25

我知道我们可以使用 Google Instant 的存储 api 将数据从即时应用程序传输到完整应用程序,如上所述here https://developers.google.com/android/reference/com/google/android/gms/instantapps/InstantAppsClient#getInstantAppData().

对于运行操作系统版本低于 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 文件时,它无法找到它。文件的全名是什么?是否有更好的方法将我的共享偏好数据从即时应用程序传输到已安装的应用程序。


花了几个小时后,我终于成功了,但后来我发现了一种更好、更简单的方法来做到这一点。 Google 还有一个 cookies api,可用于在用户升级时将即时应用程序的数据共享到完整应用程序。

文档:https://developers.google.com/android/reference/com/google/android/gms/instantapps/PackageManagerCompat#setInstantAppCookie(byte%5B%5D) 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 https://github.com/googlesamples/android-instant-apps/tree/master/cookie-api

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

希望这对某人有帮助。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何将共享首选项从即时应用程序转移到完整应用程序 的相关文章

  • Jetpack Compose 在方向更改时保存状态

    我正在使用 Android Jetpack 的 Compose 并且一直在尝试找出如何保存方向更改的状态 我的思路是让一个类成为 ViewModel 因为当我使用 Android 的传统 API 时 这通常是有效的 我使用 Remember
  • 可点击的 ImageView 和 ImageButton 之间的区别

    我只是想知道之间是否有任何显着差异ImageView与设置为可点击的ImageButton 有什么理由使用其中一种而不是另一种吗 对可绘制对象是否有任何限制ImageButton那留下ImageView作为唯一可能的选择 如果我选择可点击按
  • Android Studio:clang 错误:未知参数:'-mandroid'

    我正在尝试使用 NDK 构建一个项目 但无法消除此错误 我在谷歌上进行了搜索 但只有 Xamarin 出现类似的错误 我正在使用 Android Studio 该错误的全部内容是 FAILURE Build failed with an e
  • 从线程设置 imageView

    我正在使用朋友下载图片并设置在ImageView 但是 我收到此错误 只有创建视图层次结构的原始线程才能触摸其视图 这是我的代码 ImageView profilePicture Thread thread new Thread Overr
  • 如何使用GSON将JSON字符串转换为对象集合?

    我有以下课程 public class UserObject implements Serializable public Integer id public String name public String phoneno public
  • 在匿名类中实现两个接口

    我有两个接口 interface A void foo interface B void bar 我可以创建实现这些接口之一的类的匿名实例 如下所示 new A void foo or new B void bar 我想创建一个实现这两个接
  • 在Android的IntentService中等待异步回调

    我有一个IntentService在另一个类中启动异步任务 然后等待结果 问题是IntentService将尽快完成onHandleIntent 方法已经运行完毕了 对吗 这意味着 通常情况下 IntentService异步任务启动后会立即
  • 为什么我无法从具有 1024 MB RAM 的 Eclipse 启动 AVD?

    因此 就像很多人使用 Eclipse 开始 Android 开发一样 即使机器速度很快 我也注意到模拟器运行速度慢得令人沮丧 我搜索了任何让它运行得更快的技巧 然后我遇到了这个问题 https stackoverflow com quest
  • Android SwitchPreferences 在 PreferenceActivity 中一起更改

    我在 Android 应用程序中使用 SwitchPreference 并发现了一些奇怪的东西 首选项中存在多个 SwitchPreference 当我使用 PreferenceActivity 的默认布局时 一切都运行良好 但是 在我将自
  • 无法使用 asmack 和 XMPP 接收文件

    我正在使用 Asmack 和 XMPP 进行文件共享 我能够发送文件 但无法在另一台设备上接收文件 我做了很多研究和开发 发现了很多方法都尝试过 但都没有成功 似乎我犯了一些小错误 尝试了很多 但还没有解决我的问题 我用于发送文件的代码是
  • 如何删除本地缓存中的可用状态?

    因此 我正在开发一个使用 firebase 的 firestore 的应用程序 并且想知道这是否可能 因为我不希望我的应用程序检查服务器中不再存在的数据 例子 collectionReference addSnapshotListener
  • 如何使用 AsyncTask 或任何其他方法在 ListView 中加载更多项目

    我对 Android 开发非常陌生 我知道这个问题之前可能已经得到答案 但我似乎找不到适合我情况的答案 我正在创建一个 Android 应用程序 其中有一个ListView显示项目列表 当用户到达页脚时 我需要显示更多项目 例如另外 10
  • 如何序列化 android.graphics.Path 对象

    我正在尝试将 Android graphics Path 对象存储在内部设备内存中 有谁知道如何序列化 android graphics Path 对象 另外 还有其他方法来存储 Path 对象吗 谢谢 我这样做的方法是从原始 Path 类
  • 如果没有 Fabric API 密钥,Firebase Crashlytics 无法工作

    我有一个安装了 Fabric Crashytics 的 Android 应用程序 我已按照官方指南设置 Firebase Crashlytics 并链接 Fabric 和 Firebase 帐户 AFAIK Firebase 最近收购了 F
  • Android ZXing 实现

    我使用 ZXing 源代码创建了一个项目 效果很好 更改包名后 com google zxing client android to com google zxing client android vofox 但在真实设备 HTC Wild
  • 检测适配器中的滚动方向(向上/向下)

    我正在尝试在我的项目中模仿 Google Plus 应用程序 因为它现在似乎是参考 滚动时的列表视图效果非常好 我想做类似的事情 我从 LayoutAnimationController 开始http android er blogspot
  • 使用 RxJava 和播放服务愿景时出现致命信号 11 (SIGSEGV)

    在我的应用程序中 我使用图片中人物位置的定义 之后 我使用 RxJava 处理生成的图像并输出结果 完成后重新运行该过程 所有这些都可以在三星 华为 魅族等设备上完美运行 Android 5 0 及更高版本 但在小米 无论什么版本的andr
  • 导航视图中的彩色图标

    再会 有没有办法在导航抽屉上显示彩色图标 不将它们着色或将它们设置为黑色 并且当在导航抽屉中单击时 它们每个都会有相应的颜色 突出显示 背景 就像 Google 商店应用程序抽屉一样 是的 您可以使用菜单组项添加彩色图标
  • Android底部导航栏定制

    我已经成功实现了简单的底部栏 它看起来像图 1 但我想进一步自定义它 这样它就可以看起来像 Youtube 的 Android 应用程序中的底部栏 当您单击其中一个项目时 它会传播阴影效果 我当前的底部栏 YouTube 的底部栏 我还想将
  • 如何以降序而不是升序使用 orderByKey() #Askfirebase

    嗨 David 和 Firebase 团队 我试图通过最近的 侦察 来订购 FragmentStatePagerAdapter 中的选项卡 将项目插入 FragmentStatePagerAdapter 并使其正确刷新似乎真的很难 因此 如

随机推荐

  • 如何仅向 NSDate 添加工作日?

    我有一个与 Objective C 中计算工作日相关的问题 我需要添加X给定的工作日NSDate 例如 如果我有一个约会 2010 年 10 月 22 日星期五 我添加2工作日 我应该得到 2010 年 10 月 26 日星期二 提前致谢
  • 如何在 Android 中从 ArrayList 填充的列表视图中选择多个项目

    我正在尝试编写一个程序来选择我填充的列表视图中的多个项目 但我很难选择多个项目 请让我知道该怎么做 下面是我填充数组列表的方式 并且我有一个带有复选框的自定义行 我需要在按钮单击事件上获取所选项目 名称 编号 先感谢您 我试图理解其他帖子
  • Laravel 子域路由不起作用

    我正在尝试拥有一个管理子域 像这样 https laravel com docs 5 1 routing route group sub domain routing Route group domain gt admin localhos
  • HikariCP 和 maxLifetime

    我将我的项目移至HikariCP https github com brettwooldridge HikariCP 到目前为止一切都很顺利 但在一种设置下我遇到了麻烦 这是 setMaxLifetime 30 1000 HikariCon
  • 使用资源中的几何图形的 WPF 自定义按钮

    有没有办法使用这样的 PathGeometry 集合 路径1 F1 中号 170 255 178 837L 170 255 221 158C 170 255 228 917 164 174 230 777 156 745 225 286L
  • 如何处理 AJAX 中的预期错误(包括向用户公开它们)

    预期错误是我在代码中预期甚至自己提出的来自服务器的错误 例如 当用户尝试执行他没有足够权限的操作时 我会提出PermissionError 一个习俗Exception 并带有描述错误的消息 我一直在寻找一种好方法来处理 AJAX 情况下的预
  • 如何以声明方式管理 Kafka 主题?

    我们正在使用 Apache Kafka 并且有很多手动创建的主题 使用自定义主题配置 我们希望像代码一样管理我们的主题 就像我们的基础设施 配置的其余部分一样 我们如何以编程方式和声明方式管理我们的主题 什么是理智的方法 以下是可能适合您正
  • Rails:PG :: UndefinedTable:错误:关系“...”不存在

    迁移时我收到以下错误消息 PG UndefinedTable ERROR relation actioncodes does not exist ALTER TABLE organizations ADD CONSTRAINT fk rai
  • 使用 Polars 生成运行记录,其中一个月的期末余额将成为下个月的期初余额

    我想在给定初始期初余额的情况下生成一段时间内的运行计数模拟 例如 一个虚构的企业从 1000 美元开始 在任何一个月内都会经历随机的盈利和亏损 12 个月后 这家企业可能会赚多少钱 我的问题是 我可以生成所需的列 但无法弄清楚如何在不破坏当
  • phpMyAdmin get_scripts.js.php 和 messages.php 很慢

    当我检查 127 0 0 1 phpmyadmin 上的网络活动时 我发现 get scripts js php 和 messages php 需要 7 到 16 秒才能执行 我打开这些脚本并添加了缓存时间 但问题仍然存在 header E
  • Pygame 声音延迟 - 与缓冲区/采样无关

    我试图在我的小游戏中播放简单的 wav 文件 每当用户将鼠标悬停在按钮上时 就会播放一点点击声音 实际按下按钮时也是如此 因此 我遇到了每个未正确初始化混音器的人都会遇到的普遍滞后问题 然而 当我正确初始化它时 它仍然有 0 5 秒的延迟
  • 使用 BLPOP 的 Redis 作业队列

    我尝试使用 redis 和 ruby eventmachine 创建无限作业队列 为了实现这一点 我使用了 0 超时的 redis BLPOP 命令 成功 BLPOP 后 我再次运行它 我的方法正确还是有更好的方法来使用 Redis 创建作
  • 什么时候 .the(success, failed) 被视为 Promise 的反模式?

    我看了一下蓝鸟承诺常见问题解答 https github com petkaantonov bluebird wiki Promise anti patterns 其中提到 then success fail 是一个反模式 https gi
  • VB.NET 的 LINQ 中 ORDERBY 的语法是什么?

    我是 Linq 新手 VB 中 order by 的语法是什么 Dim cxt As New datContext Dim qry From lst In cxt zipcodes Select lst state Distinct qry
  • 使用 ssl 从 Spring Boot 应用程序连接到 MongoDB

    我正在尝试使用 ssl 将我的 Spring Boot 应用程序连接到 mongodb 我按照此处描述的步骤进行操作 但它们对我不起作用 https www compose com articles how to connecting to
  • 替换 NSString 中的特定单词

    获取和替换字符串中特定单词的最佳方法是什么 例如我有 NSString currentString one two thing thing good 现在我需要找到每个 currentWord 并为其应用函数 self replaceWor
  • react-native-fbsdk:如何正确从 facebook 注销?

    我正在使用react native fbsdk npm 包 它工作正常 但是当我调用 LoginManager logOut 时 它不会执行任何操作 甚至它的回调函数也不起作用 首次登录后 它会保留我的所有数据 首次登录并从应用程序注销后
  • 在 spring mvc 中使用 thymeleaf 引用 .css 文件

    我正在用 spring MVC 和 Thymeleaf 做一个项目 我有一个问题 如果我有这个文件夹结构 我应该如何引用我的 CSS 文件 src main webapp resources myCssFolder myCssFile cs
  • Java 中的多个布局管理器

    有没有办法在Java中使用超过1个布局管理器 现在我正在使用 gridLayout 来实现棋盘 但在它下面我想放置一些其他东西 但不在 gridLayout 中 也许是 FlowLayout 或其他一些布局 我该怎么做呢 谢谢 是的 您所需
  • 如何将共享首选项从即时应用程序转移到完整应用程序

    我知道我们可以使用 Google Instant 的存储 api 将数据从即时应用程序传输到完整应用程序 如上所述here https developers google com android reference com google a