前言:这篇仅对于unity 发布Android端上架国内应用商店添加隐私协议,隐私协议是很重要的东西,没有这个东西,是不上了应用商店的。
对于仅仅添加隐私协议,我知道有三种方式,第一种和第二种基本一样
1.直接在unity里面新建PrivacyActivity.java,然后自定义一下AndroidManifest,就可以(就是直接在unity里面建java类了)(复杂度 低)
2.从Android studio 里面打出arr包,导入unity 里面使用 (复杂度 高)
3.从unity里面导出android studio 工程,在Android studio里面添加 (复杂度 高)
如何选择,这三种方法,我个人建议,如果只是添加隐私协议这种简单的需求,第一种就可以。我会实际演示这三种方式
以下是第二和第三方法的优缺点对比:
方法 | 优点 | 缺点 |
---|---|---|
从 Android Studio 导出 AAR 包到 Unity | 1. 灵活性高,可以专注于 Android 原生代码的开发,而 Unity 负责游戏逻辑和渲染。 2. 适合需要在 Unity 中调用 Android 原生功能的场景,比如调用 Android 的 API 或第三方 SDK。 3. AAR 包可以独立于 Unity 项目开发和维护,便于模块化管理。 | 1. 需要额外的步骤来确保 AAR 包与 Unity 的兼容性,比如导入 classes.jar 和处理资源文件冲突。 2. 如果需要频繁修改 Android 代码,每次都需要重新导出 AAR 包并更新 Unity 项目,流程相对繁琐。 |
从 Unity 导出 Android Studio 工程,在 Android Studio 里面添加 | 1. 适合需要对 Unity 生成的 Android 项目进行深度定制的场景,比如修改 Gradle 配置、添加原生代码或第三方库。 2. 可以直接在 Android Studio 中调试和优化 Unity 生成的代码,便于解决复杂的构建问题。 | 1. Unity 导出的 Android 工程结构复杂,包含大量自动生成的代码,可能增加开发和维护的难度。 2. 如果需要频繁在 Unity 和 Android Studio 之间切换开发,可能会导致项目文件的不一致。 |
因为这个字数比较多,我先介绍一下第三中,第一二种,后续会更新
三.第三种方法
从unity里面导出android studio 工程,在Android studio里面添加
步骤介绍,四步走
- 第一步从unity打包出Android studuio 工程文件
- - 第二步 使用Android studio 打开项目
-


我这里选的是Use Android Studio SDK,点击完成后,就打开了
- 第三步,新建一个软件包,(我们把自己写逻辑代码都放在里面,比如隐私协议啊,或者微信登录支付什么的都可以放在这里,软件包的本质就是一个文件夹),具体步骤如下图
右上角,视图选择为项目,Android studio 好几种视图模式,我们这里选择项目
- 第四步,在com.companyName.projcetName,文件夹下新建一个PrivacyActvity活动,(实现我们隐私协议部分),并替换代码,具体如下图


csharp
package com.companyName.projectName; //这里修改为你的包名
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.util.TypedValue;
import android.webkit.WebView;
public class PrivacyActivity extends Activity implements DialogInterface.OnClickListener {
private static final String PREFS_NAME = "PlayerPrefs"; // SharedPreferences的文件名
private static final String PRIVACY_ACCEPTED_KEY = "PrivacyAcceptedKey"; // 用于存储用户是否同意隐私政策的键
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
// 检查用户是否已经同意隐私政策
if (getPrivacyAccept()) {
// 如果已经同意,直接进入Unity主Activity
enterUnityActivity();
return;
}
// 如果未同意,显示隐私政策对话框
showPrivacyDialog();
}
private String buildPrivacyHtml() {
// 在这里设置隐私政策和用户协议的链接,修改为你的
String userAgreementUrl = "https://blog.csdn.net/weixin_45478456?type=blog";
String privacyPolicyUrl = "https://blog.csdn.net/weixin_45478456?type=blog";
// 动态生成隐私政策的HTML内容
return "欢迎使用本应用,在使用本应用前,请您充分阅读并理解 " +
"<a href=\"" + userAgreementUrl + "\">《用户协议》</a>和" +
"<a href=\"" + privacyPolicyUrl + "\">《隐私政策》</a>各条;" +
"<br/>" +
"1.保护用户隐私是本应用的一项基本政策,本应用不会泄露您的个人信息;" +
"<br/>" +
"2.我们会根据您使用的具体功能需要,收集必要的用户信息(如申请设备信息,存储等相关权限);" +
"<br/>" +
"3.在您同意App隐私政策后,我们将进行集成SDK的初始化工作,会收集您的android_id、Mac地址、IMEI和应用安装列表,以保障App正常数据统计和安全风控;" +
"<br/>" +
"4.为了方便您的查阅,您可以通过"设置-关于我们"重新查看该协议;" +
"<br/>" +
"5.您可以阅读完整版的隐私保护政策了解我们申请使用相关权限的情况,以及对您个人隐私的保护措施。";
}
private void showPrivacyDialog() {
// 创建一个WebView用于显示隐私政策的HTML内容
WebView webView = new WebView(this);
webView.loadData(buildPrivacyHtml(), "text/html", "utf-8");
// 创建一个不可取消的对话框
AlertDialog.Builder privacyDialog = new AlertDialog.Builder(this);
privacyDialog.setCancelable(false);
privacyDialog.setView(webView); // 设置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:
// 如果点击了"拒绝"按钮
finish(); // 结束当前Activity,退出应用
break;
}
}
private void enterUnityActivity() {
// 创建一个Intent,用于启动Unity主Activity
Intent unityAct = new Intent();
unityAct.setClassName(this, "com.unity3d.player.UnityPlayerActivity");
startActivity(unityAct);
}
private void setPrivacyAccept(boolean accepted) {
// 使用SharedPreferences保存用户是否同意隐私政策的状态
SharedPreferences.Editor prefs = getSharedPreferences(PREFS_NAME, MODE_PRIVATE).edit();
prefs.putBoolean(PRIVACY_ACCEPTED_KEY, accepted);
prefs.apply(); // 提交更改
}
private boolean getPrivacyAccept() {
// 从SharedPreferences中获取用户是否同意隐私政策的状态,默认为false
SharedPreferences prefs = getSharedPreferences(PREFS_NAME, MODE_PRIVATE);
return prefs.getBoolean(PRIVACY_ACCEPTED_KEY, false);
}
}
代码关键处都注释了,不懂,拿代码直接问AI就好
- 第五步,替换AndroidManifest.xml里的内容,具体如图,代码在图下面(!注意,这里的内容和第一个,第二个方法里的不同)
AndroidManifest.xml
xml
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools">
<uses-permission android:name="android.permission.INTERNET" />
<uses-feature android:glEsVersion="0x00030000" />
<uses-feature
android:name="android.hardware.vulkan.version"
android:required="false" />
<uses-feature
android:name="android.hardware.touchscreen"
android:required="false" />
<uses-feature
android:name="android.hardware.touchscreen.multitouch"
android:required="false" />
<uses-feature
android:name="android.hardware.touchscreen.multitouch.distinct"
android:required="false" />
<application android:extractNativeLibs="true">
<activity
android:name="com.companyName.projectName.PrivacyActivity"
android:exported="true">
<!-- 添加以下 intent-filter -->
<intent-filter>
<category android:name="android.intent.category.LAUNCHER" />
<action android:name="android.intent.action.MAIN" />
</intent-filter>
</activity>
<meta-data
android:name="unity.splash-mode"
android:value="0" />
<meta-data
android:name="unity.splash-enable"
android:value="True" />
<meta-data
android:name="unity.launch-fullscreen"
android:value="True" />
<meta-data
android:name="unity.render-outside-safearea"
android:value="True" />
<meta-data
android:name="notch.config"
android:value="portrait|landscape" />
<meta-data
android:name="unity.auto-report-fully-drawn"
android:value="true" />
<activity
android:name="com.unity3d.player.UnityPlayerActivity"
android:configChanges="mcc|mnc|locale|touchscreen|keyboard|keyboardHidden|navigation|orientation|screenLayout|uiMode|screenSize|smallestScreenSize|fontScale|layoutDirection|density"
android:exported="true"
android:hardwareAccelerated="false"
android:launchMode="singleTask"
android:resizeableActivity="false"
android:screenOrientation="fullUser"
android:theme="@style/UnityThemeSelector">
<meta-data
android:name="unityplayer.UnityActivity"
android:value="true" />
<meta-data
android:name="notch_support"
android:value="true" />
</activity>
</application>
</manifest>
- 第六步,打包测试,我这里用的是雷电模拟器测试,步骤如下
先打开雷电模拟器

等待一会,就可以在模拟器里看到了

这样子就OK啦
如果想打包出正式版本,打包出apk的话,大致步骤如下图
填写好之后,无脑下一步
成功后,去下图项目这个文件夹就可以找到apk