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");

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";

参数说明

KeyTypeUseNote
app_nameString应用名称不传将使用调用方应用名
all_purposeString应用用途弹窗第一段(“欢迎您使用 Demo,您可使用本应用以实现…功能”),由于翻译过程拼接字段可能存在问题,所以整段文字支持自定义,字段为 all_purpose
main_purposeString应用主要用途如果没传 all_purpose 字段,sdk 会拼接这个字段生成默认描述用途文案:(“欢迎您使用 xxxx,您可使用本应用以实现 $main_purpose 功能”),此字段和 all_purpose 二选一即可。
runtime_permString[]必选权限项见权限列表
runtime_perm_descString[]必选权限用途长度与 runtime_perm 项一致
user_agreementString用户协议链接 (https://www.user_agreement.com)
privacy_policyString隐私政策链接 (https://www.privacy_policy.com)
perm_keyString关心的 key如果关心的是车机管家定义好的 key,可以传给 sdk,用于一些定制化的需求,如果不明白可以找研发确认这个是不是需要。例如车联网开关,sdk 默认有一些配置文案,业务方没传自定义文案时可以使用默认文案,并且会自动存储用户同意后的值。
permission_descString自定义隐私描述这两个字段需要配合使用,用户自定义隐私描述,可支持用户自定义 N 多个链接场景
permission_highlight_mapHashMap<String,String>自定义隐私描述中高亮文字和跳转链接的 map(同上)这两个字段需要配合使用

运行时权限列表

ItemKeyCategory分类截图
获取手机信息android.permission.READ_PHONE_STATE
android.permission.READ_PRIVILEGED_PHONE_STATE
电话权限组分项1
读取电话号码android.permission.READ_PHONE_NUMBERS电话权限组分项1
接听电话android.permission.ANSWER_PHONE_CALLS
Manifest.permission_group.PHONE
Manifest.permission.MODIFY_PHONE_STATE
电话权限组分项2
拨打电话android.permission.CALL_PHONE电话权限组分项2
读取通话记录android.permission.READ_CALL_LOG
android.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_CONTACTS
Manifest.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_SMS
Manifest.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_ADMIN
Manifest.permission.BLUETOOTH_PRIVILEGED
开关蓝牙8
WIFIandroid.permission.CHANGE_WIFI_STATE开关 WIFI9
NFCandroid.permission.NFCNFC10
读取应用列表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