【Unity6打包Android】游戏启动的隐私政策弹窗(报错处理)

发布于:2025-03-16 ⋅ 阅读:(17) ⋅ 点赞:(0)

Unity版本:Unity6000.0.24

增加弹窗步骤

1. 自定义AndroidManifest

1.1 在Player Setting => Publishing Settings => Build下勾选Custom Main Manifest,在Assets/Plugins/Android路径下生成AndroidManifest.xml文件

1.2 修改AndroidManifest.xml文件内容

修改Unity自动生成的AndroidManifest,增加新的PrivacyActivity,作为主Activity,并作为默认启动界面

<?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"
                  android:theme="@style/UnityThemeSelector"
                  android:exported="true">
            <intent-filter>
                <action android:name="android.intent.action.MAIN"/>
                <category android:name="android.intent.category.LAUNCHER"/>
            </intent-filter>
        </activity>
        <!--Used when Application Entry is set to Activity, otherwise remove this activity block-->
        <activity android:name="com.unity3d.player.UnityPlayerActivity"
                  android:theme="@style/UnityThemeSelector">
            <meta-data android:name="unityplayer.UnityActivity" android:value="true"/>
        </activity>
        <!--Used when Application Entry is set to GameActivity, otherwise remove this activity block-->
        <activity android:name="com.unity3d.player.UnityPlayerGameActivity"
                  android:theme="@style/BaseUnityGameActivityTheme">
            <meta-data android:name="unityplayer.UnityActivity" android:value="true"/>
            <meta-data android:name="android.app.lib_name" android:value="game"/>
        </activity>
    </application>
    <uses-permission android:name="android.permission.INTERNET"/>
</manifest>

2. 处理隐私政策弹窗逻辑

在Assets/Plugins/Android/com.unity3d.player路径下,创建PrivacyActivity.java文件,启动APP后判断是否要弹出隐私政策弹窗。

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 {

    // 隐私协议HTML内容,包含隐私政策链接及具体条款
   final String privacyContext =
             "欢迎使用本游戏,在使用本游戏前,请您充分阅读并理解 <a href=\"https://unity3d.com/cn/legal/privacy-policy\">" +
             "《Unity隐私政策》</a>和<a href=\"https://developer.taptap.com/docs/sdk/start/agreement/\">《TapTap隐私政策》</a>各条;\n" +
     "1.保护用户隐私是本游戏的一项基本政策,本游戏不会泄露您的个人信息;\n\n" +
     "2.我们会根据您使用的具体功能需要,收集必要的用户信息(如申请设备信息,存储等相关权限);\n\n" +
     "3.在您同意App隐私政策后,我们将进行集成SDK的初始化工作,会收集您的android_id、Mac地址、IMEI和应用安装列表,以保障App正常数据统计和安全风控;\n\n" +
     "4.您可以阅读完整版的隐私保护政策了解我们申请使用相关权限的情况,以及对您个人隐私的保护措施;\n\n" +
     "5.为了保障游戏安全稳定运行并实现特定功能,会接入第三方开发的软件工具开发包,我们会对游戏接入的涉及个人信息收集的SDK进行安全监测,以保护您的个人信息安全:\n\n"+
     "5.1 SDK名称:Unity 3D\n"+
     "5.1.1 SDK使用目的:框架\n"+
     "5.1.2 SDK收集的信息:Android ID、设备传感器信息\n";
    
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
  
        // 创建Activity时首先检查是否已同意隐私协议
        // 如果已经同意过隐私协议则直接进入Unity Activity
        if (GetPrivacyAccept()){
            EnterUnityActivity();
            return;
        }
        // 弹出隐私协议对话框
        ShowPrivacyDialog();
    }
 
    // 显示隐私协议对话框,使用WebView加载HTML格式的隐私条款内容
    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:   //点击同意
                SetPrivacyAccept(true);         //本地存储保存同意隐私协议状态
                EnterUnityActivity();           //启动Unity Activity
                break;
            case AlertDialog.BUTTON_NEGATIVE:   //点击拒绝,退出App
                finish();
                break;
        }
    }
    
    // 启动Unity Activity
    private void EnterUnityActivity(){
        Intent unityAct = new Intent();
        unityAct.setClassName(this, "com.unity3d.player.UnityPlayerGameActivity");
        this.startActivity(unityAct);
    }
    
    // 本地存储保存同意隐私协议状态
    private void SetPrivacyAccept(boolean accepted){
        SharedPreferences.Editor prefs = this.getSharedPreferences("PlayerPrefs", MODE_PRIVATE).edit();
        prefs.putBoolean("PrivacyAcceptedKey", accepted);
        prefs.apply();
    }
    
    // 获取是否已经同意过
    private boolean GetPrivacyAccept(){
        SharedPreferences prefs = this.getSharedPreferences("PlayerPrefs", MODE_PRIVATE);
        return prefs.getBoolean("PrivacyAcceptedKey", false);
    }
}

注意项1:Unity Activity

PrivacyActivity.java中跳转的Unity Activity界面是UnityPlayerGameActivity,而不是UnityPlayerActivity。使用UnityPlayerActivity会闪退,具体原因还不清楚。

UnityPlayerActivity:这是 Unity 提供的默认 Activity 类;
UnityPlayerGameActivity:针对游戏应用做了优化。

注意项2:java编码格式

PrivacyActivity.java文件编码格式要设置为UTF-8,不能是UTF-8 with BOM,否则打包会出现编译问题。

打包报错:

/Users/zcs/workspace/ProjectC/Library/Bee/Android/Prj/IL2CPP/Gradle/unityLibrary/src/main/java/com/unity3d/player/PrivacyActivity.java:1: ??????: ????????????: ''
???package com.unity3d.player;
^
/Users/zcs/workspace/ProjectC/Library/Bee/Android/Prj/IL2CPP/Gradle/unityLibrary/src/main/java/com/unity3d/player/PrivacyActivity.java:1: ??????: ?????? class???interface???enum ??? record
???package com.unity3d.player;
         ^
2 ?????????

FAILURE: Build failed with an exception.

* What went wrong:
Execution failed for task ':unityLibrary:compileReleaseJavaWithJavac'.
> Compilation failed; see the compiler error output for details.

* Try:
> Run with --info option to get more log output.
> Run with --scan to get full insights.

 可以用VSCode修改编码格式: