一,平臺(tái)測(cè)試隱私問(wèn)題
場(chǎng)景 1:
APP 未見向用戶明示個(gè)人信息收集使用的目的、方式和范圍,未經(jīng)用戶同意,存在收集 Android ID、SIM 卡信息的行為。(存在風(fēng)險(xiǎn))
場(chǎng)景 2:
APP 未見向用戶明示 SDK 收集使用個(gè)人信息的目的、方式和范圍,未經(jīng)用戶同意,SDK 存在收集 com.unity3d.player 獲 取 SIM 卡信息、com.unity3d.player 獲取 Android ID 的行為。(存在風(fēng)險(xiǎn))
二,解決方式一
在Unity啟動(dòng)前,添加Activity 用于進(jìn)行隱私政策的展示和授權(quán)。
PS:不導(dǎo)出安卓工程直接打包apk的方式可以使用此解決方案,導(dǎo)出安卓工程的打包apk方式的看后面的方案二。
下面是在Unity中的操作步驟。
2.1 勾選自定義Mainifest
勾選自定義Mainifest。Project Settings
--> Player
--> Andorid
–>Publishing Settings
-->Custom Main Manifest
:
2.2 修改自定義Mainifest
最終的Mainifest截圖:
添加代碼釋義:
-
設(shè)置為主 Activity,當(dāng)應(yīng)用程序啟動(dòng)時(shí)。系統(tǒng)將會(huì)查找具有該 intent action 的 Activity 并將其作為默認(rèn)啟動(dòng)界面。
<action android:name="android.intent.action.MAIN" />
-
設(shè)置為啟動(dòng) Activity。 它將會(huì)在應(yīng)用程序列表中顯示一個(gè)應(yīng)用圖標(biāo),并且當(dāng)用戶點(diǎn)擊次圖標(biāo)時(shí),它將作為默認(rèn)啟動(dòng)界面啟動(dòng)應(yīng)用程序。
<category android:name="android.intent.category.LAUNCHER" />
-
添加網(wǎng)絡(luò)訪問(wèn)權(quán)限
<uses-permission android:name="android.permission.INTERNET"/>
最終的AndroidManifest源碼:
<?xml version="1.0" encoding="utf-8"?>
<manifest
xmlns:android="http://schemas.android.com/apk/res/android"
package="com.unity3d.player"
xmlns:tools="http://schemas.android.com/tools">
<application>
<activity android:name="com.unity3d.player.PrivacyActivity">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
<activity android:name="com.unity3d.player.UnityPlayerActivity"
android:theme="@style/UnityThemeSelector">
<meta-data android:name="unityplayer.UnityActivity" android:value="true" />
</activity>
</application>
<uses-permission android:name="android.permission.INTERNET"/>
</manifest>
2.3 隱私協(xié)議彈窗邏輯
創(chuàng)建PrivacyActivity.java
文件,路徑:Assets/Plugins/Android/com.unity3d.player/PrivacyActivity.java
,
注意文件夾名稱不要寫錯(cuò),因?yàn)閁nity導(dǎo)出的安卓工程使用的就是com.unity3d.player
路徑。
使用時(shí)需將下面代碼:隱私政策的描述和網(wǎng)絡(luò)地址 修改為自己的項(xiàng)目需要的即可。代碼注釋比較詳細(xì)不在贅述。
PrivacyActivity 代碼如下:
package com.unity3d.player;
import android.app.Activity;
import android.app.AlertDialog;
import android.content.DialogInterface;
import android.content.Intent;
import android.content.SharedPreferences;
import android.os.Bundle;
import android.webkit.WebView;
public class PrivacyActivity extends Activity implements DialogInterface.OnClickListener {
// 隱私協(xié)議內(nèi)容
final String privacyContext =
"歡迎使用本游戲,在使用本游戲前,請(qǐng)您充分閱讀并理解 <a href=\"https://blog.csdn.net/czhenya\">" +
"《用戶協(xié)議》</a>和<a href=\"https://blog.csdn.net/czhenya\">《隱私政策》</a>各條;\n" +
"1.保護(hù)用戶隱私是本游戲的一項(xiàng)基本政策,本游戲不會(huì)泄露您的個(gè)人信息;\n" +
"2.我們會(huì)根據(jù)您使用的具體功能需要,收集必要的用戶信息(如申請(qǐng)?jiān)O(shè)備信息,存儲(chǔ)等相關(guān)權(quán)限);\n" +
"3.在您同意App隱私政策后,我們將進(jìn)行集成SDK的初始化工作,會(huì)收集您的android_id、Mac地址、IMEI和應(yīng)用安裝列表,以保障App正常數(shù)據(jù)統(tǒng)計(jì)和安全風(fēng)控;\n" +
"4.為了方便您的查閱,您可以通過(guò)“設(shè)置”重新查看該協(xié)議;\n" +
"5.您可以閱讀完整版的隱私保護(hù)政策了解我們申請(qǐng)使用相關(guān)權(quán)限的情況,以及對(duì)您個(gè)人隱私的保護(hù)措施。";
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
// 如果已經(jīng)同意過(guò)隱私協(xié)議則直接進(jìn)入U(xiǎn)nity Activity
if (GetPrivacyAccept()){
EnterUnityActivity();
return;
}
// 彈出隱私協(xié)議對(duì)話框
ShowPrivacyDialog();
}
// 顯示隱私協(xié)議對(duì)話框
private void ShowPrivacyDialog(){
WebView webView = new WebView(this);
webView.loadData(privacyContext, "text/html", "utf-8");
AlertDialog.Builder privacyDialog = new AlertDialog.Builder(this);
privacyDialog.setCancelable(false);
privacyDialog.setView(webView);
privacyDialog.setTitle("提示");
privacyDialog.setNegativeButton("拒絕",this);
privacyDialog.setPositiveButton("同意",this);
privacyDialog.create().show();
}
@Override
public void onClick(DialogInterface dialogInterface, int i) {
switch (i){
case AlertDialog.BUTTON_POSITIVE://點(diǎn)擊同意按鈕
SetPrivacyAccept(true);
EnterUnityActivity(); //啟動(dòng)Unity Activity
break;
case AlertDialog.BUTTON_NEGATIVE://點(diǎn)擊拒絕按鈕,直接退出App
finish();
break;
}
}
// 啟動(dòng)Unity Activity
private void EnterUnityActivity(){
Intent unityAct = new Intent();
unityAct.setClassName(this, "com.unity3d.player.UnityPlayerActivity");
this.startActivity(unityAct);
}
// 本地存儲(chǔ)保存同意隱私協(xié)議狀態(tài)
private void SetPrivacyAccept(boolean accepted){
SharedPreferences.Editor prefs = this.getSharedPreferences("PlayerPrefs", MODE_PRIVATE).edit();
prefs.putBoolean("PrivacyAcceptedKey", accepted);
prefs.apply();
}
// 獲取是否已經(jīng)同意過(guò)
private boolean GetPrivacyAccept(){
SharedPreferences prefs = this.getSharedPreferences("PlayerPrefs", MODE_PRIVATE);
return prefs.getBoolean("PrivacyAcceptedKey", false);
}
}
至此,就完成全部流程了,直接導(dǎo)出apk。運(yùn)行會(huì)先彈出隱私界面,同意后才啟動(dòng)Unity
三,解決方式二
此方案適用于Unity項(xiàng)目導(dǎo)出Android工程后在打包apk的方式。邏輯同上,只是將上面在Unity里面的操作修改到Android工程中了。
操作步驟如下:
3.1 導(dǎo)出安卓工程
- 目標(biāo)平臺(tái)切換到Android
- 勾選Export Project
- 點(diǎn)擊Export選擇導(dǎo)出目錄導(dǎo)出即可
導(dǎo)出后工程目錄:
然后使用AndroidStudio打開即可
3.2 創(chuàng)建上層Activity
還是使用的上文2.3中的代碼邏輯,在com.unity3d.player
下創(chuàng)建PrivacyActivity
把代碼粘貼進(jìn)去即可:
將工程模式調(diào)整成Project,即可看到下圖一樣的目錄結(jié)構(gòu):
3.3 配置AndroidManifest
添加新的PrivacyActivity
,然后將UnityPlayerActivity
中的intent-filter
剪切上來(lái):
<activity android:name="com.unity3d.player.PrivacyActivity"
android:exported="true">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
四,源碼分享
實(shí)現(xiàn)邏輯就是在Unity啟動(dòng)前添加一個(gè)同意隱私的彈出,實(shí)現(xiàn)步驟就按照上面的操作即可,還有不明白的童鞋可以評(píng)論或私信,我看到就會(huì)及時(shí)回復(fù)。文章來(lái)源:http://www.zghlxwxcb.cn/news/detail-524516.html
為了便于以后其他項(xiàng)目復(fù)用,我導(dǎo)出UnityPackage和安卓工程進(jìn)行保存:
工程源碼
點(diǎn)擊下面????卡片,回復(fù) 隱私 可獲得上圖解決隱私問(wèn)題的源碼工程~文章來(lái)源地址http://www.zghlxwxcb.cn/news/detail-524516.html
到了這里,關(guān)于Unity 之 超級(jí)詳細(xì)的隱私問(wèn)題解決方案的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!