Android APP之间共享数据

背景:

Binder AIDL,Socket可以解决APP之间的通信。

APP之间的数据安全共享该如何实现呢?

方案:

利用ContentProvider和contentResolver可实现在不同应用程序之间的数据共享,并保证被访问数据的安全性。ContentProvider用于暴露数据,contentResolver用于操作数据。

案例:

Google 地图-车辆界面

使用地图-车辆接口 (MVI)协议缓冲区API 实现 Google 地图与车辆制造商的车辆系统之间的双向通信。通常,该接口由 OEM 厂商通过运行在 Android Automotive 平台上的应用程序来实现。

Google sample介绍原文:

Maps-Vehicle Interface Architecture

The Maps-Vehicle Interface (MVI) uses the Android:
The MVI exchanges data in three steps:
  1. The vehicle notifies Google Maps, through Android ContentResolver, that either new content is available or existing content has changed.

  2. Google Maps queries the vehicle's ContentProvider, through Android ContentResolver, with a specific content Uri.

  3. Once a data pipe has been established, wire-encoded protocol buffers can be exchanged by Google Maps either by reading or writing to the OEM app ContentProvider.

实现细节:

创建内容提供程序

Google Maps 订阅了一个 Android ContentProvider类,OEM 应用必须实现该类才能与 Google Maps 交换数据。OEM 应用只需实现其ContentProvider类的ContentProvider.openFile方法,该方法返回一个ParcelFileDescriptor ,用于建立一个读/写数据管道,以便交换通过ParcelFileDescriptor.createPipe获取的线编码协议缓冲区。对于任何特定的内容URIContentProvider实现必须严格支持两种访问模式:一种是只读访问模式("r"),用于从车辆读取数据到地图;另一种是只写访问模式("w"),用于从地图向车辆写入数据。

注意: OEM 应用可以将线路编码的协议缓冲区存储在SharedPreferences中,该缓冲区在应用重启后仍然保留。您可以在oem/VehicleContentProvider.java中查看ContentProvider示例实现(以及将序列化的协议缓冲区存储在SharedPreferences中)。

允许 Google Maps 访问 ContentProvider 类

要使 Google Maps 能够访问ContentProvider类,必须在 Android Manifest 文件中通过<provider>标签将其公开。最重要的是,必须将exported属性设置为true ,以允许外部应用查询ContentProvider类,并且权限必须为google_maps_energy (用于电动汽车能源模型功能)或google_maps_settings (用于 Google Maps 自定义功能)。例如:

复制代码
<provider
    android:name=".VehicleContentProvider"
    android:authorities="google_maps_settings"
    android:exported="true"/>

处理多个内容授权,授权实体之间用分号(;)隔开;在单个ContentProvider实现中处理多个内容授权机构是可行的,但并非必须。为此, ContentProvider必须在AndroidManifest.xml<provider>标签中列出所有要处理的授权机构(用分号分隔)。以下示例允许VehicleContentProvider类同时处理google_maps_settingsgoogle_maps_energy内容授权

复制代码
<provider
    android:name=".VehicleContentProvider"
    android:authorities="google_maps_settings;google_maps_energy"
    android:exported="true"/>
相关推荐
alexhilton43 分钟前
Jetpack Compose内部的不同节点类型
android·kotlin·android jetpack
Frank_HarmonyOS2 小时前
Android中四大组件之一的Activity的启动模式
android
似霰3 小时前
HIDL Hal 开发笔记7----简单 HIDL HAL 实现
android·framework·hal
用户2018792831676 小时前
📚 Android Settings系统:图书馆管理员的故事
android
青莲8436 小时前
Android 事件分发机制 - 事件流向详解
android·前端·面试
火柴就是我7 小时前
学习一些常用的混合模式之BlendMode. dst_atop
android·flutter
火柴就是我7 小时前
学习一些常用的混合模式之BlendMode. dstIn
android·flutter
ganshenml8 小时前
【Android】 开发四角版本全解析:AS、AGP、Gradle 与 JDK 的配套关系
android·java·开发语言
我命由我123458 小时前
Kotlin 运算符 - == 运算符与 === 运算符
android·java·开发语言·java-ee·kotlin·android studio·android-studio
摘星编程9 小时前
【RAG+LLM实战指南】如何用检索增强生成破解AI幻觉难题?
android·人工智能