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

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"?>
<manifestxmlns: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";@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);// 创建Activity时首先检查是否已同意隐私协议// 如果已经同意过隐私协议则直接进入Unity Activityif (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();}// 处理对话框按钮点击事件@Overridepublic void onClick(DialogInterface dialogInterface, int i) {switch (i){case AlertDialog.BUTTON_POSITIVE:   //点击同意SetPrivacyAccept(true);         //本地存储保存同意隐私协议状态EnterUnityActivity();           //启动Unity Activitybreak;case AlertDialog.BUTTON_NEGATIVE:   //点击拒绝,退出Appfinish();break;}}// 启动Unity Activityprivate 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修改编码格式:

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/32812.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

记录一个SQL自动执行的html页面

在实际工作场景中&#xff0c;需要运用到大量SQL语句更新业务逻辑&#xff0c;对程序员本身&#xff0c;写好的sql语句执行没有多大问题&#xff08;图1&#xff09;&#xff0c;但是对于普通用户来说还是有操作难度的。因此我们需要构建一个HTML页面&#xff08;图2&#xff0…

mac安装mysql之后报错zsh: command not found: mysql !

在Mac上安装MySQL后&#xff0c;如果终端中找不到mysql命令&#xff0c;通常是 因为MySQL的命令行工具&#xff08;如mysql客户端&#xff09;没有被正确地添加到你的环境变量中。 检查 MySQL 是否已安装 ps -ef|grep mysql查看到路径在 /usr/local/mysql/bin 查看 .bash_pro…

socket编程与TCP协议

如果你想和远方的朋友通电话&#xff0c;但是&#xff0c;没有办法直接把自己的声音放在电线上变成电流信号&#xff0c;你需要使用电话机拿起听筒拨号&#xff0c;而这个电话就是Socket&#xff0c;它让你简单方便地完成电流通话&#xff0c;从我们编程的角度来看&#xff0c;…

css基本功

为什么 ::first-letter 是伪元素&#xff1f; ::first-letter 的作用是选择并样式化元素的第一个字母&#xff0c;它创建了一个虚拟的元素来包裹这个字母&#xff0c;因此属于伪元素。 grid布局 案例一 <!DOCTYPE html> <html lang"zh-CN"><head&…

环境配置 | 5分钟极简Git入门:从零上手版本控制

你是否刚接触Git&#xff1f;别担心&#xff01;这篇指南将用最简单的步骤带你掌握Git核心操作&#xff0c;快速开启版本控制之旅&#xff01;✨ 1.git在win10上的下载安装 1.1.下载git 打开官方网站 Git - Downloadshttps://git-scm.com/downloads ​ ​​ 1.2.git安装 …

软件工程概述、软件过程模型、逆向工程(高软45)

系列文章目录 软件工程概述、软件过程模型、逆向工程。 文章目录 系列文章目录前言一、软件工程概述二、能力成熟度模型1.能力成熟度模型CMM2.能力成熟度模型集成CMMI 三、软件过程模型1.瀑布模型SDLC2.原型化模型3.螺旋模型4.增量模型5.喷泉模型6.敏捷模型7.统一过程模型RUP 四…

接口自动化入门 —— Jmeter实现在接口工具中关联接口处理方案

1. JMeter 接口关联处理的核心概念 接口关联是指在多个接口请求之间共享数据&#xff0c;例如将一个接口的返回值作为另一个接口的输入参数。常见的场景包括&#xff1a; 使用登录接口返回的 Token 作为后续接口的认证信息。 将一个接口返回的 ID 作为另一个接口的请求参数。…

websocket学习手册及python实现简单的聊天室

概述 WebSocket 是一种网络通信协议&#xff0c;允许在单个 TCP 连接上进行全双工通信。它最核心的优势就在于实现了持久连接&#xff0c;实现了实时的数据传输。HTTP 协议有一个很大的缺点&#xff0c;通信只能由客户端发起&#xff0c;服务器返回响应后连接就会关闭&#xf…

小白学习:提示工程(什么是prompt)

课程链接 https://www.bilibili.com/video/BV1PX9iYQEry/?spm_id_from333.337.search-card.all.click 一 什么是提示工程 【提示工程】也叫【指令工程】 prompt就是给大模型发的指令&#xff0c;如“给我讲个笑话” 懂得提示工程原理会带来什么优势 懂得原理 为什么有的指…

ROS实践(五)机器人自动导航(robot_navigation)

目录 一、知识点 1. 定位 2. 路径规划 (1)全局路径规划 (2)局部路径规划 3. 避障 二、常用工具和传感器 三、相关功能包 1. move_base(决策规划) 2. amcl(定位) 3. costmap_2d(代价地图) 4. global_planner(全局规划器) 5. local_planner(局部规划器…

分治算法区

分治 一.分治二.经典应用案例三.快速排序&#xff08;1&#xff09;颜色分类&#xff08;2&#xff09;排序数组&#xff08;3&#xff09;数组中第K个最大的元素 四.归并排序1.排序数组2.交易逆序对总数3.计算右侧小于当前元素的个数4.翻转对 一.分治 分治算法是一种通过将复…

设计模式C++

针对一些经典的常见的场景, 给定了一些对应的解决方案&#xff0c;这个就叫设计模式。 设计模式的作用&#xff1a;使代码的可重用性高&#xff0c;可读性强&#xff0c;灵活性好&#xff0c;可维护性强。 设计原则&#xff1a; 单一职责原则&#xff1a;一个类只做一方面的…

零成本搭建Calibre个人数字图书馆支持EPUB MOBI格式远程直读

文章目录 前言1.网络书库软件下载安装2.网络书库服务器设置3.内网穿透工具设置4.公网使用kindle访问内网私人书库 前言 嘿&#xff0c;各位书虫们&#xff01;今天要给大家安利一个超级炫酷的技能——如何在本地Windows电脑上搭建自己的私人云端书库。亚马逊服务停了&#xff…

Qt 数据库操作(Sqlite)

数据库简介 关于数据库的基础知识这里就不做介绍了&#xff0c;相关博客可以查看&#xff1a; SQL基础知识 数据库学霸笔记 上面博客都写的比较详细&#xff0c;本文主要介绍如何使用Qt进行数据库相关操作&#xff0c;数据库分为关系型数据库和非关系型数据&#xff0c;关系…

hackme靶机详细攻略

扫描ip arp-scan -l 访问网站后&#xff0c;点击sign up now注册 注册后登录 点击search显示全部数据 尝试sql注入 确认闭合方式 OSINTand 12# 确定列数 OSINT order by 3# 显示正常 OSINT order by 4# 显示异常 确认回显位置 -1 union select 1,2,3# 确认数据库名 -…

Tweak Power:全方位电脑系统优化的高效工具

在日常使用电脑时&#xff0c;系统性能的下降、垃圾文件的堆积以及硬盘的老化等问题常常困扰着用户。为了提升电脑性能、优化系统运行&#xff0c;许多人会选择系统优化工具。然而&#xff0c;国内一些系统优化软件常常因为广告过多或功能冗杂而让人望而却步。此时&#xff0c;…

element-plus中Autocomplete自动补全输入框组件的使用

目录 1.基本使用 ①从官网赋值如下代码 ②查看运行效果 ③代码解读 2.调用后端接口&#xff0c;动态获取建议数据 结语 1.基本使用 ①从官网赋值如下代码 <template> <div><!-- 自动补全输入框 --><el-autocompletev-model"state":fetc…

SSM基础专项复习6——Spring框架AOP(3)

系列文章 1、SSM基础专项复习1——SSM项目整合-CSDN博客 2、SSM基础专项复习2——Spring 框架&#xff08;1&#xff09;-CSDN博客 3、SSM基础专项复习3——Spring框架&#xff08;2&#xff09;-CSDN博客 4、SSM基础专项复习4——Maven项目管理工具&#xff08;1&#xff…

MATLAB基于ResNet18的交通标志识别系统

1. 数据准备 数据集&#xff1a;该数据集包含了大量标注好的交通标志图片&#xff0c;每类标志都有不同的样本。数据预处理&#xff1a;图像需要进行一些基本的预处理&#xff0c;如调整大小、归一化等&#xff0c;以适应ResNet18的输入要求。 2. 网络设计 使用MATLAB自带的…

【2步解决】phpstudy开机自启(自动启动phpstudy、mysql、nignx或apache、自动打开网址)

重启执行最终效果图&#xff1a; 一、场景 线下部署&#xff0c;需要开启自动动&#xff0c;并打开网址http://localhost/。 二、操作步骤 ①、新建start.txt&#xff0c;并修改为start.bat&#xff0c;使用记事本编辑&#xff0c;粘贴上方代码如下&#xff1a; echo off:…