CTA隐私授权API
提供给系统签名 App 一个公用的展示权限的样式弹窗,业务方可通过传参数控制展示的具体内容。
例子截图:

测试 demo 安装包:
📎 [附件: 测试demo安装包 (APK) - token: Pr4Bb0JE4olRb6xpD8xc5Kwnn7d] (下载 403)
通用开关 API:
备注
有些 cta 开关和开机隐私相关,对应的开关等 api 可看这个文档:开机隐私授权(doc-id: Fn6hdtibhov7VZx0ADmc6sVKnlg)
调用 CTA 弹窗的方法
1、增加权限配置
需要增加权限配置,权限是签名级别,需要使用系统签名:
<uses-permission android:name="com.mi.car.permission.SYSTEM_PERMISSION_DECLARE"/>2、配置展示内容
CTA 弹窗的调用方一般是跨进程的,支持隐式调用:action = "micar.intent.action.CTA_DECLARE"。
CTA 弹窗从上往下的可配置区域说明:
| 区域 | 说明 | 例子 |
|---|---|---|
| 标题 | 1、可通过参数 app_name 配置名字,sdk 会在名字前面自动加上”欢迎使用”字样2、也可以不传 app_name 参数,sdk 会自动尝试获取调用方的应用名称(需要使用 startActivityForResult 调用打开才能获取到),并会在前面自动增加”欢迎使用”字样 | |
| 描述 | 1、可以通过参数 all_purpose 传递描述文案,需要换行的话增加 \n 可以支持 | java<br/>// 传描述文案,需要换行可增加 \n<br/>intent.putExtra("all_purpose", "本应用需要联网、调用位置权限、使用准确" +<br/> "的位置信息来提供驾车导航服务有关个人信息处理的范围、目的和方式以及撤回统一等详情可通过《服务条款》、《隐私政策》了解。");<br/> |
| 权限列表 | 1、通过参数 runtime_perm 传递使用的 android 权限名称,可以参考文档下面的权限列表2、通过参数 runtime_perm_desc 传递权限描述文案3、权限的名称(例如:麦克风权限等名字)sdk 会自动根据传过来的 android 权限名称自动匹配,匹配不到的会显示”其他” | java<br/>// 要申请的权限,可参考后面的权限表罗列到这里<br/>intent.putExtra("runtime_perm", new String[]{<br/> "android.permission-group.LOCATION",<br/> "android.permission.READ_SMS"<br/>});<br/>// 要申请的权限的描述,要和上面权限数量一致<br/>intent.putExtra("runtime_perm_desc", new String[]{<br/> "获取车辆的定位权限",<br/> "获取车辆的定位权限"<br/>});<br/> |
| 隐私说明 | 1、sdk 可以支持自定义配置隐私说明文案和其中可点击的区域以及点击后的链接 2、sdk 也支持默认的隐私说明文案,默认文案最多支持两个链接,一个隐私政策,一个用户协议,app 调用方可通过配置这两个链接使用默认文案 | 见下方代码示例 |
| 选择按钮 | 选择按钮点击后可在 onActivityResult 方法中通知调用方用户的选择项返回值定义: - 同意返回: 1- 取消返回: 666- 传递信息不健全返回: -1 |
自定义隐私说明文案例子(Kotlin):
putExtra("permission_desc", "有关个人信息处理目的、范围和方式及撤回同意路径可查阅《地图隐私政策》《地图用户协议》《高德地图隐私政策》《高德地图用户协议》。请仔细阅读上述声明,点击取消则无法使用该服务。点击同意即表示你同意上述内容。")
var permission = HashMap<String, String>()
permission.put("地图隐私政策", "https://terms.ev.mi.com/map/privacy")
permission.put("地图用户协议", "https://terms.ev.mi.com/map/agreement")
permission.put("高德地图隐私政策", "https://terms.ev.mi.com/mapGaode/privacy")
permission.put("高德地图用户协议", "https://terms.ev.mi.com/mapGaode/agreement")
putExtra("permission_highlight_map", permission)默认隐私文案使用例子(Java):
// 服务条款链接
intent.putExtra("user_agreement", "https://api.sec.miui.com/res/docs/disclaimer/privacy?lang=");
// 隐私政策链接
intent.putExtra("privacy_policy", "https://api.sec.miui.com/res/docs/disclaimer/privacy?lang=");使用示例
private static final int REQUEST_CODE = 0x01;
public void main() {
showCtaDialog();
}
private void showCtaDialog() {
Intent intent = new Intent("micar.intent.action.CTA_DECLARE");
// 传描述文案,需要换行可增加 \n
intent.putExtra("all_purpose", "本应用需要联网、调用位置权限、使用准确" +
"的位置信息来提供驾车导航服务有关个人信息处理的范围、目的和方式以及撤回统一等详情可通过《服务条款》、《隐私政策》了解。");
// 服务条款链接,链接需要提供 https 的
intent.putExtra("user_agreement", "https://api.sec.miui.com/res/docs/disclaimer/privacy?lang=");
// 隐私政策链接
intent.putExtra("privacy_policy", "https://api.sec.miui.com/res/docs/disclaimer/privacy?lang=");
// 要申请的权限,可参考后面的权限表罗列到这里
intent.putExtra("runtime_perm", new String[]{
"android.permission-group.LOCATION",
"android.permission.READ_SMS"
});
// 要申请的权限的描述,要和上面权限数量一致
intent.putExtra("runtime_perm_desc", new String[]{
"位置服务:获取车辆的定位权限",
"位置服务:获取车辆的定位权限"
});
// 必传:这行固定写这个包名
intent.setPackage("com.mi.car.defaultapps");
startActivityForResult(intent, REQUEST_CODE);
}
// 获取返回值:用户选择了同意还是取消
// 返回值定义:同意返回:1 取消返回:666 传递信息不健全返回 -1
@Override
public void onActivityResult(int requestCode, int resultCode, Intent data) {
super.onActivityResult(requestCode, resultCode, data);
if (requestCode == REQUEST_CODE) {
// 返回值定义如下面代码块
Log.d("---xyl---", " 结果是 = " + ((resultCode == 1) ? "同意" : "取消"));
}
}注意
1、传递的弹窗内容:包括使用的权限,以及权限描述,隐私和用户协议链接都需要调用方提供传输。
- 注意特殊情形:
- 如果你要弹的弹窗是车联网系统服务开关,可使用默认文案:
- 因为有多个应用共用此开关,所以 sdk 对这个开关弹窗提供了默认文案,可以通过传
perm_key字段,并赋值车联网开关标志,sdk 会帮助你使用默认文案,当然也可以自己指定文案(指定方法参考下面对接文档)覆盖默认文案: - 传输车联网开关标志代码示例:
intent.putExtra("perm_key", "mi_auth_key_car_net");
- 因为有多个应用共用此开关,所以 sdk 对这个开关弹窗提供了默认文案,可以通过传
- 如果你要弹的弹窗是车联网系统服务开关,可使用默认文案:
2、用户选择结果存储(用户是否同意):
- 用户选择同意和拒绝的结果需要每一个业务方自己存储,sdk 不做统一存储。
- 特殊情况:
- 如果你的弹窗是车机管家定义的开关,属于下列其中的任意一个(车联网系统服务开关、
智能辅助驾驶服务、地图导航服务、小爱语音服务),当用户点击同意按钮时,只要你指定了你使用的开关 key,key 是上面其中一个(如果你没有指定就不会帮你存,需要你自己存),sdk 可以帮助你存储用户点击了同意,并将值通过SettingsProvider提供给你。具体读写方法参考:开机隐私授权(doc-id:Fn6hdtibhov7VZx0ADmc6sVKnlg) - 传输车联网开关标志代码示例:
intent.putExtra("perm_key", "mi_auth_key_car_net");
- 如果你的弹窗是车机管家定义的开关,属于下列其中的任意一个(车联网系统服务开关、
// 车机管家定义的几个开关
/**
* 车联网系统服务开关
*/
public static final String AUTH_KEY_CAR_NET = "mi_auth_key_car_net";
/**
* 智能辅助驾驶服务
*/
public static final String AUTH_KEY_INTELLIGENT = "mi_auth_key_intelligent";
/**
* 地图导航服务
*/
public static final String AUTH_KEY_MAP = "mi_auth_key_map";
/**
* 小爱语音服务
*/
public static final String AUTH_KEY_XIAOAI = "mi_auth_key_xiaoai";参数说明
| Key | Type | Use | Note |
|---|---|---|---|
app_name | String | 应用名称 | 不传将使用调用方应用名 |
all_purpose | String | 应用用途 | 弹窗第一段(“欢迎您使用 Demo,您可使用本应用以实现…功能”),由于翻译过程拼接字段可能存在问题,所以整段文字支持自定义,字段为 all_purpose。 |
main_purpose | String | 应用主要用途 | 如果没传 all_purpose 字段,sdk 会拼接这个字段生成默认描述用途文案:(“欢迎您使用 xxxx,您可使用本应用以实现 $main_purpose 功能”),此字段和 all_purpose 二选一即可。 |
runtime_perm | String[] | 必选权限项 | 见权限列表 |
runtime_perm_desc | String[] | 必选权限用途 | 长度与 runtime_perm 项一致 |
user_agreement | String | 用户协议链接 (https://www.user_agreement.com) | |
privacy_policy | String | 隐私政策链接 (https://www.privacy_policy.com) | |
perm_key | String | 关心的 key | 如果关心的是车机管家定义好的 key,可以传给 sdk,用于一些定制化的需求,如果不明白可以找研发确认这个是不是需要。例如车联网开关,sdk 默认有一些配置文案,业务方没传自定义文案时可以使用默认文案,并且会自动存储用户同意后的值。 |
permission_desc | String | 自定义隐私描述 | 这两个字段需要配合使用,用户自定义隐私描述,可支持用户自定义 N 多个链接场景 |
permission_highlight_map | HashMap<String,String> | 自定义隐私描述中高亮文字和跳转链接的 map | (同上)这两个字段需要配合使用 |
运行时权限列表
| Item | Key | Category | 分类 | 截图 |
|---|---|---|---|---|
| 获取手机信息 | android.permission.READ_PHONE_STATEandroid.permission.READ_PRIVILEGED_PHONE_STATE | 电话权限组分项 | 1 | ![]() |
| 读取电话号码 | android.permission.READ_PHONE_NUMBERS | 电话权限组分项 | 1 | ![]() |
| 接听电话 | android.permission.ANSWER_PHONE_CALLSManifest.permission_group.PHONEManifest.permission.MODIFY_PHONE_STATE | 电话权限组分项 | 2 | ![]() |
| 拨打电话 | android.permission.CALL_PHONE | 电话权限组分项 | 2 | ![]() |
| 读取通话记录 | android.permission.READ_CALL_LOGandroid.permission-group.CALL_LOG | 电话权限组分项 | 3 | ![]() |
| 修改通话记录 | android.permission.WRITE_CALL_LOG | 电话权限组分项 | 3 | ![]() |
| 添加语音邮件 | android.permisison.ADD_VOICEMAIL | 电话权限组分项 | 4 | ![]() |
| 视频服务 | android.permission.USE_SIP | 电话权限组分项 | 2 | ![]() |
| 监听通话状态 | android.permission.PROCESS_OUTGOING_CALLS | 电话权限组分项 | 2 | ![]() |
| 读取联系人 | android.permission.READ_CONTACTSManifest.permission_group.CONTACTS | 联系人权限组分项 | 5 | ![]() |
| 修改联系人 | android.permission.WRITE_CONTACTS | 联系人权限组分项 | 5 | ![]() |
| 获取帐号 | android.permission.GET_ACCOUNTS | 手机帐号权限组 | 6 | ![]() |
| 定位 | android.permission-group.LOCATION | 定位权限组 | 14 | ![]() |
| 访问日历 | android.permission-group.CALENDAR | 日历权限组 | 12 | ![]() |
| 发送短信 | android.permission.READ_SMSManifest.permission_group.SMS | 短信权限组分项 | 7 | ![]() |
| 读取短信 | android.permission.SEND_SMS | 短信权限组分项 | 7 | ![]() |
| 发送彩信 | android.permission.SEND_MMS | 短信权限组分项 | 7 | ![]() |
| 读取彩信 | android.permission.READ_MMS | 短信权限组分项 | 7 | ![]() |
| 相机 | android.permission-group.CAMERA | 相机权限组 | 13 | ![]() |
| 录音 | android.permission-group.MICROPHONE | 录音权限组 | 15 | ![]() |
| 读写手机存储 | android.permission-group.STORAGE | 手机存储权限组 | 16 | ![]() |
| 蓝牙 | android.permission.BLUETOOTH_ADMINManifest.permission.BLUETOOTH_PRIVILEGED | 开关蓝牙 | 8 | ![]() |
| WIFI | android.permission.CHANGE_WIFI_STATE | 开关 WIFI | 9 | ![]() |
| NFC | android.permission.NFC | NFC | 10 | ![]() |
| 读取应用列表 | com.android.permission.GET_INSTALLED_APPS | 读取应用列表 | 11 | ![]() |
| 其他 | 提供一个默认图标 | 17 | 待定 |
车机管家开关定义 key
// settings key for authorization
/**
* 车联网系统服务开关
*/
public static final String AUTH_KEY_CAR_NET = "mi_auth_key_car_net";
/**
* 智能辅助驾驶服务
*/
public static final String AUTH_KEY_INTELLIGENT = "mi_auth_key_intelligent";
/**
* 地图导航服务
*/
public static final String AUTH_KEY_MAP = "mi_auth_key_map";
/**
* 小爱语音服务
*/
public static final String AUTH_KEY_XIAOAI = "mi_auth_key_xiaoai";
/**
* 车联网系统服务子开关:用户体验改进计划
*/
private static final String AUTH_KEY_CAR_NET_SUB = "mi_auth_key_car_net_sub";📥 抓取自飞书 wiki 空间 7541192071952990209,obj_token: Akccdvo8PobaKPx4K7wcj7wMnXf
























