監管部門要求在使用者點擊隱私協議彈框中 同意 按鈕之前,App 不可以調用相關敏感 API。為應對此監管要求,mPaaS Android 10.1.32.17 以上(32 版本) 和 10.1.60.5 以上(60 版本)的基準提供了支援。如果您採用的是組件化的接入方法,請您根據實際情況參考本文對工程進行改造。
使用方法
彈出隱私彈框的 Activity 不可以繼承 mPaaS 的 BaseActivity,因為 BaseActivity 會進行埋點資料擷取,會導致 App 在同意隱私政策之前採集隱私資料。
建立隱私許可彈框回調類。在代碼中建立一個類,實現
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
中查看。在 60 基準下,您需要在 Portal 工程的主 module 下,建立
res_slinks
檔案,並將您的資源所在的 bundle 的group
和artifact
按照規則寫到res_slinks
檔案內。規則為group-artifact.split("-")[0]
。如果組合後內容過長需要換行,請您注意進行換行處理。例如:group = com.mpaas.demo.materialdesignartifact = materialdesign-build
,最終寫入res_slinks
檔案中的配置是com.mpaas.demo.materialdesign-materialdesign
。完成以上內容後,您可以直接使用
LayoutInflator.inflate(R.layout.xxx)
來調用資源。
在
AndroidManifest
中註冊彈框回調類。在portal
的AndroidManifest
中註冊隱私許可彈框回調類,value
是剛才實現的隱私許可彈框回調類的全路徑。代碼如下所示。注意將全路徑及類名要替換成您自己的回調類。<!--隱私許可彈框回調--> <meta-data android:name="privacy.listener" android:value="com.mpaas.demo.launcher.MyPrivacyListener" />
啟動彈框攔截。在
MockLauncherApplicationAgent
的preInit
中,加入啟動彈框攔截。代碼如下所示://檢測是否要向使用者進行隱私許可彈框 if(!PrivacyUtil.isUserAgreed(getApplicationContext())){ PermissionGate.getInstance().waitForUserConform(mContext, getMicroApplicationContext()); }
啟動第一個 Activity。在
MockLauncherActivityAgent
的postInit
中,進行第一個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); } } ); } } }