全部產品
Search
文件中心

Mobile Platform as a Service:隱私許可權彈框的使用說明

更新時間:Jul 13, 2024

監管部門要求在使用者點擊隱私協議彈框中 同意 按鈕之前,App 不可以調用相關敏感 API。為應對此監管要求,mPaaS Android 10.1.32.17 以上(32 版本) 和 10.1.60.5 以上(60 版本)的基準提供了支援。如果您採用的是組件化的接入方法,請您根據實際情況參考本文對工程進行改造。

使用方法

重要

彈出隱私彈框的 Activity 不可以繼承 mPaaS 的 BaseActivity,因為 BaseActivity 會進行埋點資料擷取,會導致 App 在同意隱私政策之前採集隱私資料。

  1. 建立隱私許可彈框回調類。在代碼中建立一個類,實現 PrivacyListener 介面,類的實現可以參考以下代碼:

    public class MyPrivacyListener implements PrivacyListener {
     // 在本方法內進行隱私許可彈框
     @Override
     public void showPrivacy(final Activity activity, final PrivacyResultCallback privacyResultCallback) {
         if(null==privacyResultCallback){
            return;
         }
         if(null!=activity){
             new AlertDialog.Builder(activity)
                     .setTitle("隱私許可彈框")
                     .setMessage("主體內容")
                     .setPositiveButton("同意繼續使用", new DialogInterface.OnClickListener() {
                         @Override
                         public void onClick(DialogInterface dialogInterface, int i) {
                             // 點擊確定後,取消彈框
                             dialogInterface.cancel();
                             // 將彈框結果設定為 true
                             privacyResultCallback.onResult(true);
                         }
                     })
                     .setNegativeButton("不同意並退出", new DialogInterface.OnClickListener() {
                         @Override
                         public void onClick(DialogInterface dialogInterface, int i) {
                             // 點擊不同意後,取消彈框
                             dialogInterface.cancel();
                             // 將彈框結果設定為 false
                             privacyResultCallback.onResult(false);
                             // 結束掉當前的 activity,架構會殺掉進程
                             if(null!=activity){
                                 activity.finish();
                             }
                         }
                     })
                     .setCancelable(false)
                     .create()
                     .show();
         }else{
             // 如果 activity 是空的話,回調結果設定 false
             privacyResultCallback.onResult(false);
         }
     }
    }
    說明

    如果您使用的是 10.1.68.42 及以上版本基準且需要清除隱私狀態,請實現 PrivacyListener2 介面,並實現 shouldClear 函數。

    以下代碼是對 shouldClear 函數的說明:

    @Override
    public boolean shouldClear(Context context) {
      //使用者沒有點同意隱私協議預設用 SharedPreferences 儲存 false 設定為 return false。如果需要再次彈窗需 SP 儲存 true 設定為return true;
      return false;//return 的值取 SP 裡面存的 boolean 值。
    }

    回調時,一定要彈出一個對話方塊來觸發 windowFocusChange,觸發後架構才會進行後續的操作。由於該回調類會由系統架構進行反射初始化,且時機非常早,因此請不要添加帶方法名的建構函式,以及在建構函式中加入具體邏輯。

    如果您需要在彈出對話方塊這裡使用資源,在不同基準下需要採用不同的方法。

    • 在 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.materialdesignartifact = materialdesign-build,最終寫入 res_slinks 檔案中的配置是 com.mpaas.demo.materialdesign-materialdesign1

      完成以上內容後,您可以直接使用 LayoutInflator.inflate(R.layout.xxx) 來調用資源。

  2. AndroidManifest 中註冊彈框回調類。在 portalAndroidManifest 中註冊隱私許可彈框回調類,value 是剛才實現的隱私許可彈框回調類的全路徑。代碼如下所示。注意將全路徑及類名要替換成您自己的回調類。

    <!--隱私許可彈框回調-->
    <meta-data
     android:name="privacy.listener"
     android:value="com.mpaas.demo.launcher.MyPrivacyListener" />
  3. 啟動彈框攔截。在 MockLauncherApplicationAgentpreInit 中,加入啟動彈框攔截。代碼如下所示:

    //檢測是否要向使用者進行隱私許可彈框
    if(!PrivacyUtil.isUserAgreed(getApplicationContext())){
     PermissionGate.getInstance().waitForUserConform(mContext, getMicroApplicationContext());
    }
  4. 啟動第一個 Activity。在 MockLauncherActivityAgentpostInit 中,進行第一個 Activity 的跳轉。代碼如下所示:

    public class MockLauncherActivityAgent extends LauncherActivityAgent {
        
        private Handler mUIHandler = new Handler(Looper.getMainLooper());
        
        @Override
        public void preInit(Activity activity) {
            super.preInit(activity);
        }
    
        @Override
        public void postInit(final Activity activity) {
            super.postInit(activity);
    
            if (PrivacyUtil.isUserAgreed(activity)) {
                mUIHandler.postDelayed(new Runnable() {
                    public void run() {
                        Intent intent = new Intent(activity, MainActivity.class);
                        activity.startActivity(intent);
                        activity.finish();
                    }
                }, 1000);
            } else {
    
                PermissionGate.getInstance().registerPrivacyCallback(
                        new PrivacyCallback() {
                            @Override
                            public void onTermsOfUseAgreed() {
                                mUIHandler.postDelayed(new Runnable() {
                                    public void run() {
                                        Intent intent = new Intent(activity, MainActivity.class);
                                        activity.startActivity(intent);
                                        activity.finish();
                                    }
                                }, 1000);
                            }
                        }
                );
            }
        }
    
    }