全部产品
云市场
云游戏

隐私权限弹框的使用说明(Portal&Bundle 接入方式)

更新时间:2020-04-14 17:22:54

背景

监管部门要求在用户点击隐私协议弹框中“同意”按钮之前,App 不可以调用相关敏感API。为应对此监管要求,mPaaS Android 10.1.32.17 以上(32 版本) 和 10.1.60.5 以上(60 版本)的基线提供了支持,请您根据实际情况参考本文对工程进行改造。

使用方法

  1. 新建隐私许可弹框回调类。
    在代码中新建一个类,实现PrivacyListener接口,类的实现可以参考以下代码:

    1. public class MyPrivacyListener implements PrivacyListener {
    2. // 在本方法内进行隐私许可弹框
    3. @Override
    4. public void showPrivacy(final Activity activity, final PrivacyResultCallback privacyResultCallback) {
    5. if(null==privacyResultCallback){
    6. return;
    7. }
    8. if(null!=activity){
    9. new AlertDialog.Builder(activity)
    10. .setTitle("隐私许可弹框")
    11. .setMessage("主体内容")
    12. .setPositiveButton("同意继续使用", new DialogInterface.OnClickListener() {
    13. @Override
    14. public void onClick(DialogInterface dialogInterface, int i) {
    15. // 点击确定后,取消弹框
    16. dialogInterface.cancel();
    17. // 将弹框结果设置为 true
    18. privacyResultCallback.onResult(true);
    19. }
    20. })
    21. .setNegativeButton("不同意并退出", new DialogInterface.OnClickListener() {
    22. @Override
    23. public void onClick(DialogInterface dialogInterface, int i) {
    24. // 点击不同意后,取消弹框
    25. dialogInterface.cancel();
    26. // 将弹框结果设置为 false
    27. privacyResultCallback.onResult(false);
    28. // 结束掉当前的 activity,框架会杀掉进程
    29. if(null!=activity){
    30. activity.finish();
    31. }
    32. }
    33. })
    34. .setCancelable(false)
    35. .create()
    36. .show();
    37. }else{
    38. // 如果 activity 是空的话,回调结果设置 false
    39. privacyResultCallback.onResult(false);
    40. }
    41. }
    42. }
    注意
    • 回调时,一定要弹出一个 dialog 来触发 windowFocusChange,触发后框架才会进行后续的操作。
    • 由于该回调类会由系统框架进行反射初始化,且时机非常早,因此请不要添加带方法名的构造函数,以及在构造函数中加入具体逻辑。
    • 如果您需要在弹出 dialog 这里使用资源,在不同基线下需要采用不同的方法。
      • 在 32 基线下,您需要采用如下方法:
        Resources resource = QuinoxAgent.getInstance().getResourcesByBundle("资源所在的bundle的bundlename");
        说明: bundlename 可在 Bundle 工程中的主 module 中的 /build/intermediates/bundle/META-INF/BUNDLE.MF 中查看。
        bundlename
      • 在 60 基线下,您需要在 portal 工程的主 module 下,建立 res_slinks 文件,并将您的资源所在的 bundle 的 groupartifact 按照规则写到 res_slinks 文件内。规则为 group-artifact.split("-")[0]。如果组合后内容过长需要换行,请您注意进行换行处理
        例如:
        group = com.mpaas.demo.materialdesign
        artifact = materialdesign-build
        最终写入 res_slinks 文件中的配置是 com.mpaas.demo.materialdesign-materialdesign
        1
      • 完成以上内容后,您可以直接使用 LayoutInflator.inflate(R.layout.xxx) 来调用资源。
  2. 在 AndroidManifest 中注册弹框回调类。
    portalAndroidManifest中注册隐私许可弹框回调类,value是刚才实现的隐私许可弹框回调类的全路径。代码如下所示。注意将全路径及类名要替换成您自己的回调类。

    1. <!--隐私许可弹框回调-->
    2. <meta-data
    3. android:name="privacy.listener"
    4. android:value="com.mpaas.demo.launcher.MyPrivacyListener" />
  3. 在启动时弹框。
    MockLauncherApplicationAgentpreInit中,加入启动弹框拦截。代码如下所示:

    1. //检测是否要向用户进行隐私许可弹框
    2. if(!PrivacyUtil.isUserAgreed(getApplicationContext())){
    3. PermissionGate.getInstance().waitForUserConform(mContext, getMicroApplicationContext());
    4. }
  4. 启动第一个 Activity。
    MockLauncherActivityAgentpostInit中,进行第一个Activity的跳转。代码如下所示:

    1. // 判断是否获取了用户隐私许可
    2. if(PrivacyUtil.isUserAgreed(activity)){
    3. new Handler().postDelayed(new Runnable() {
    4. public void run() {
    5. Intent intent = new Intent(activity, MainActivity.class);
    6. activity.startActivity(intent);
    7. activity.finish();
    8. }
    9. }, 200);
    10. }