Unity 之 安卓平台上架隐私问题解决方案

Unity 之 助力游戏增长 -- 解决隐私问题

  • 一,平台测试隐私问题
  • 二,解决方式一
    • 2.1 勾选自定义Mainifest
    • 2.2 修改自定义Mainifest
    • 2.3 隐私协议弹窗逻辑
  • 三,解决方式二
    • 3.1 导出安卓工程
    • 3.2 创建上层Activity
    • 3.3 配置AndroidManifest
  • 四,源码分享

一,平台测试隐私问题

场景 1:
APP 未见向用户明示个人信息收集使用的目的、方式和范围,未经用户同意,存在收集 Android ID、SIM 卡信息的行为。(存在风险)

场景 2:
APP 未见向用户明示 SDK 收集使用个人信息的目的、方式和范围,未经用户同意,SDK 存在收集 com.unity3d.player 获 取 SIM 卡信息、com.unity3d.player 获取 Android ID 的行为。(存在风险)


二,解决方式一

在Unity启动前,添加Activity 用于进行隐私政策的展示和授权。

PS:不导出安卓工程直接打包apk的方式可以使用此解决方案,导出安卓工程的打包apk方式的看后面的方案二。

下面是在Unity中的操作步骤。

2.1 勾选自定义Mainifest

勾选自定义Mainifest。Project Settings --> Player --> Andorid–>Publishing Settings -->Custom Main Manifest

2.2 修改自定义Mainifest

最终的Mainifest截图:

添加代码释义:

  • 设置为主 Activity,当应用程序启动时。系统将会查找具有该 intent action 的 Activity 并将其作为默认启动界面。
    <action android:name="android.intent.action.MAIN" />

  • 设置为启动 Activity。 它将会在应用程序列表中显示一个应用图标,并且当用户点击次图标时,它将作为默认启动界面启动应用程序。
    <category android:name="android.intent.category.LAUNCHER" />

  • 添加网络访问权限
    <uses-permission android:name="android.permission.INTERNET"/>


最终的AndroidManifest源码:

<?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"><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 隐私协议弹窗逻辑

创建PrivacyActivity.java文件,路径:Assets/Plugins/Android/com.unity3d.player/PrivacyActivity.java

注意文件夹名称不要写错,因为Unity导出的安卓工程使用的就是com.unity3d.player路径。


使用时需将下面代码:隐私政策的描述和网络地址 修改为自己的项目需要的即可。代码注释比较详细不在赘述。

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 {// 隐私协议内容final String privacyContext ="欢迎使用本游戏,在使用本游戏前,请您充分阅读并理解 <a href=\"https://blog.csdn.net/czhenya\">" +"《用户协议》</a>和<a href=\"https://blog.csdn.net/czhenya\">《隐私政策》</a>各条;\n" +"1.保护用户隐私是本游戏的一项基本政策,本游戏不会泄露您的个人信息;\n" +"2.我们会根据您使用的具体功能需要,收集必要的用户信息(如申请设备信息,存储等相关权限);\n" +"3.在您同意App隐私政策后,我们将进行集成SDK的初始化工作,会收集您的android_id、Mac地址、IMEI和应用安装列表,以保障App正常数据统计和安全风控;\n" +"4.为了方便您的查阅,您可以通过“设置”重新查看该协议;\n" +"5.您可以阅读完整版的隐私保护政策了解我们申请使用相关权限的情况,以及对您个人隐私的保护措施。";@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);// 如果已经同意过隐私协议则直接进入Unity Activityif (GetPrivacyAccept()){EnterUnityActivity();return;}// 弹出隐私协议对话框ShowPrivacyDialog();}// 显示隐私协议对话框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.UnityPlayerActivity");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);}
}

至此,就完成全部流程了,直接导出apk。运行会先弹出隐私界面,同意后才启动Unity


三,解决方式二

此方案适用于Unity项目导出Android工程后在打包apk的方式。逻辑同上,只是将上面在Unity里面的操作修改到Android工程中了。

操作步骤如下:

3.1 导出安卓工程

  1. 目标平台切换到Android
  2. 勾选Export Project
  3. 点击Export选择导出目录导出即可

导出后工程目录:

然后使用AndroidStudio打开即可


3.2 创建上层Activity

还是使用的上文2.3中的代码逻辑,在com.unity3d.player下创建PrivacyActivity把代码粘贴进去即可:

将工程模式调整成Project,即可看到下图一样的目录结构:


3.3 配置AndroidManifest

添加新的PrivacyActivity,然后将UnityPlayerActivity中的intent-filter 剪切上来:

<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>


四,源码分享

实现逻辑就是在Unity启动前添加一个同意隐私的弹出,实现步骤就按照上面的操作即可,还有不明白的童鞋可以评论或私信,我看到就会及时回复。

为了便于以后其他项目复用,我导出UnityPackage和安卓工程进行保存:

工程源码
在这里插入图片描述
点击下面👇🏻卡片,回复 隐私 可获得上图解决隐私问题的源码工程~

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

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

相关文章

通过new FormData提交简单数据

通过new FormData提交简单数据 效果示例图代码 效果示例图 代码 <!DOCTYPE html> <html><head><meta charset"utf-8"><title></title><style type"text/css">* {padding: 0px;margin: 0px;box-sizing: border-…

Maven学习及分模块创建

一、引言 1.1 项目管理问题 写项目时&#xff0c;我们需要引用各种 jar 包&#xff0c;尤其是比较大的工程&#xff0c;引用的 jar 包往往有几十个乃至上百个&#xff0c; 每用 到一种 jar 包&#xff0c;都需要手动引入工程目录&#xff0c;而且经常遇到各种让人抓狂的 jar 包…

IEC 103/104

IEC101 串口通信 串口远动协议 控制区和数据区&#xff0c;(信息体地址&#xff0c;装置地址等) IEC102 电量采集 IEC103 保护设备的通信 串口 实时监测 各种故障 103协议就是用来保护装置和后台监控进行通信的。 IEC104 调度自动化系统、厂站之间的通讯 网络 帧里面多了…

云数据库MySQL相关帮助

1.为什么创建数据库后在数据库列表中不显示&#xff1f; 因为列表读取的是information_schema&#xff0c;刚创建的数据库是空库&#xff0c;没有数据写入&#xff0c;不会写入缓存表&#xff0c;所以不会显示&#xff0c;但不影响正常使用&#xff0c;可以直接对新建的数据库进…

学习记录——Transformer、ViT、Swin-Transformer、SegFormer、TopFormer、Seaformer

Transformer 2017 Computation and Language Google Self-Attention、Multi-Head Attention 位置编码 原理参考链接 ransformer网络结构&#xff1a; ViT 2020 ICLR 将transformer引入到cv领域 将输入图片224x224x3按照16x16x3大小的Patch进行划分&#xff0c;接着通过…

栈--C语言实现数据结构

本期带大家一起用C语言实现栈&#x1f308;&#x1f308;&#x1f308; 一、栈的概念&#x1f30e; 栈是一种常见的数据结构&#xff0c;它遵循后进先出&#xff08;Last In, First Out&#xff09;的原则。可以将其类比为现实生活中的一摞书或者一叠盘子。 栈由一个连续的内…

WPF 自定义控件完成库容表盘显示效果

先看一下显示效果&#xff1a; 需要注意的地方有以下几点&#xff1a; 表盘的刻度分部&#xff0c;长刻度和短刻度显示。在数值80W时&#xff0c;需要更改刻度盘的颜色渐变。在数值80W时&#xff0c;更改库容总数背景的显示&#xff0c;也是颜色渐变。刻度盘控件属性定义&…

二、DDL-5.小结

一、数据库操作 1、查询 查询所有数据库 show databases; 查询目前所处数据库 select database(); 2、进入 进入某个数据库 use itcast; USE 数据库名; 3、创建 创建数据库 create database itcast; create database [if not exists] itcast; create database [if not …

多用户商城系统Dokan评测优点与缺点(2023)

目录 多用户商城系统Dokan优点 多用户商城系统Dokan缺点 您应该开始使用多供应商市场吗&#xff1f; 多用户商城系统Dokan评论 为什么选择Dokan&#xff1f; 用户界面 用户友好的前端 仪表板和后端 管理员后台 供应商仪表板 第三方兼容性 Dokan 可以卖什么&…

全志F1C200S嵌入式驱动开发(spi-nand驱动)

【 声明:版权所有,欢迎转载,请勿用于商业用途。 联系信箱:feixiaoxing @163.com】 和v3s一样,f1c200s也支持tf卡、spi-nor、spi-nand启动。前面也说过,tf卡由于机械结构的原因,更适合拿来学习,spi-nor和spi-nand比较适合用来进行工业部署和消费娱乐领域。只是s…

数据库应用:MySQL高级语句

目录 一、理论 1.常用查询 2.函数 3.进阶查询 二、实验 1.普通查询 2.函数 3.进阶查询 三、问题 1.MySQL || 运算符不生效 四、总结 一、理论 1.常用查询 常用查询包括&#xff1a;增、删、改、查&#xff1b; 对 MySQL 数据库的查询&#xff0c;除了基本的查询外…

如何有效检测、识别和管理 Terraform 配置漂移?

作者&#xff5c;Krishnadutt Panchagnula 翻译&#xff5c;Seal软件 链接&#xff5c;https://betterprogramming.pub/detecting-identifying-and-managing-terraform-state-drift-997366a74537 在理想的 IaC 世界中&#xff0c;我们所有的基础设施实现和更新都是通过将更新的…