監管部門要求在用戶點擊隱私協議彈框中 同意 按鈕之前,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); } } ); } } }