解决隐私权限原因拒审的终极方案. 在用户同意隐私政策前,您的应用获取了用户xx信息

article/2025/9/13 21:03:02

App上架国内市场常会遇到以下原因审核被拒:

您的应用审核未通过。在用户同意隐私政策前,您的应用获取了用户的ANDROID ID,不符合应用市场审核标准。修改建议:请在用户同意隐私政策后,再申请获取用户个人信息及权限。

 有时候App必须获取用户信息,如Android ID与账号关联,所以不能完全绕过获取信息,当然,政策是允许获取这些权限,但必须在使用权限前弹出对话框让用户选择是否同意隐私协议。 

那么怎么定位获取隐私的地方呢?如果接入了第三方SDK,就很难查出究竟是哪里提前获取了用户隐私,因为有些SDK在调用初始化API时就使用了隐私权限。

那就索性写个PrivacyActivity置于UnityPlayerActivity之前,即在UnityPlayerActivity启动前先启动隐私协议弹窗PrivacyActivity,用户点击同意后再启动UnityPlayerActivity。这样就能百分之百确保不会在用户同意隐私政策前获取用户信息。

1. 自定义AndroidManifest.xml,将启动Activity设置为自定义的PrivacyActivity:

 勾选Custom Main Manifest后会自动生成Assets/Plugins/Android/AndroidManifest.xml文件,然后做如下修改:

<?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><meta-data android:name="useLocalHtml" android:value="false" /><meta-data android:name="privacyUrl" android:value="https://blog.csdn.net/final5788" /></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>

其中<meta-data android:name="useLocalHtml" android:value="false" />和<meta-data android:name="privacyUrl"元数据是用于PrivacyActivity.java中获取这些配置值。

useLocalHtml:true表示隐私协议对话框显示的内容使用本地html文本;false则使用远程网页内容。

privacyUrl:远程网页的网址

2. 自定义隐私协议Activity, 核心逻辑是如果用户没有同意过隐私协议则弹出隐私协议对话框,若同意过直接切换到Unity Activity:

    @Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);ActivityInfo actInfo = null;try {//获取AndroidManifest.xml配置的元数据actInfo = this.getPackageManager().getActivityInfo(getComponentName(), PackageManager.GET_META_DATA);useLocalHtml = actInfo.metaData.getBoolean("useLocalHtml");privacyUrl = actInfo.metaData.getString("privacyUrl");} catch (PackageManager.NameNotFoundException e) {e.printStackTrace();}//如果已经同意过隐私协议则直接进入Unity Activityif (GetPrivacyAccept()){EnterUnityActivity();return;}ShowPrivacyDialog();//弹出隐私协议对话框}@Overridepublic void onClick(DialogInterface dialogInterface, int i) {switch (i){case AlertDialog.BUTTON_POSITIVE://点击同意按钮SetPrivacyAccept(true);EnterUnityActivity();//启动Unity Activitybreak;case AlertDialog.BUTTON_NEGATIVE://点击拒绝按钮,直接退出Appfinish();break;}}

3. 把写好的PrivacyActivity.java放到Assets/Plugins/Android/com/unity3d/player下:

4. 直接用Unity打包apk即可,无需先导出Android工程再打包apk,节省时间。

隐私协议界面使用Android原生WebView显示协议内容,比使用富文本更加强大,而且可以直接显示在线网页内容。

5. 由于隐私弹出在Unity Activity之前,如果开启了Splash Screen(Unity启动屏)会感觉很奇怪,免费版Unity不支持跳过启动屏Logo,可以尝试以下方式强制跳过Unity启动屏Logo:【Unity】一步跳过Unity启动屏/Logo, 全平台适用,Unity官方API支持_TopGames的博客-CSDN博客

PrivacyActivity.java源码:

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.content.pm.ActivityInfo;
import android.content.pm.PackageManager;
import android.os.Bundle;
import android.webkit.WebResourceError;
import android.webkit.WebResourceRequest;
import android.webkit.WebView;
import android.webkit.WebViewClient;public class PrivacyActivity extends Activity implements DialogInterface.OnClickListener {boolean useLocalHtml = true;String privacyUrl = "https://blog.csdn.net/final5788";final String htmlStr = "欢迎使用本游戏,在使用本游戏前,请您充分阅读并理解<a href=\"https://blog.csdn.net/final5788\">《用户协议》</a>和<a href=\"https://blog.csdn.net/final5788\">《隐私政策》</a>各条\n" +"款,了解我们对于个人信息的处理规则和权限申请的目的,特别提醒您注意前述协议中关于\n" +"我们免除自身责任,限制您的权力的相关条款及争议解决方式,司法管辖等内容。我们将严\n" +"格遵守相关法律法规和隐私政策以保护您的个人隐私。为确保您的游戏体验,我们会向您申请以下必要权限,您可选择同意或者拒绝,拒绝可能会导致无法进入本游戏。同时,我们会根据本游戏中相关功能的具体需要向您申请非必要的权限,您可选择同意或者拒绝,拒绝可能会导致部分游戏体验异常。其中必要权限包括:设备权限(必要):读取唯一设备标识 (AndroidID、mac),生成帐号、保存和恢复游戏数据,识别异常状态以及保障网络及运营安全。存储权限(必要):访问您的存储空间,以便使您可以下载并保存内容、图片存储及上传、个人设置信息缓存读写、系统及日志文件创建。\n";@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);ActivityInfo actInfo = null;try {//获取AndroidManifest.xml配置的元数据actInfo = this.getPackageManager().getActivityInfo(getComponentName(), PackageManager.GET_META_DATA);useLocalHtml = actInfo.metaData.getBoolean("useLocalHtml");privacyUrl = actInfo.metaData.getString("privacyUrl");} catch (PackageManager.NameNotFoundException e) {e.printStackTrace();}//如果已经同意过隐私协议则直接进入Unity Activityif (GetPrivacyAccept()){EnterUnityActivity();return;}ShowPrivacyDialog();//弹出隐私协议对话框}@Overridepublic void onClick(DialogInterface dialogInterface, int i) {switch (i){case AlertDialog.BUTTON_POSITIVE://点击同意按钮SetPrivacyAccept(true);EnterUnityActivity();//启动Unity Activitybreak;case AlertDialog.BUTTON_NEGATIVE://点击拒绝按钮,直接退出Appfinish();break;}}private void ShowPrivacyDialog(){WebView webView = new WebView(this);if (useLocalHtml){webView.loadDataWithBaseURL(null, htmlStr, "text/html", "UTF-8", null);}else{webView.loadUrl(privacyUrl);webView.setWebViewClient(new WebViewClient(){@Overridepublic boolean shouldOverrideUrlLoading(WebView view, String url) {view.loadUrl(url);return true;}@Overridepublic void onReceivedError(WebView view, WebResourceRequest request, WebResourceError error) {view.reload();}@Overridepublic void onPageFinished(WebView view, String url) {super.onPageFinished(view, url);}});}AlertDialog.Builder privacyDialog = new AlertDialog.Builder(this);privacyDialog.setCancelable(false);privacyDialog.setView(webView);privacyDialog.setTitle("User Terms & Privacy");privacyDialog.setNegativeButton("Exit",this);privacyDialog.setPositiveButton("Agree",this);privacyDialog.create().show();}
//启动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("PrivacyAccepted", accepted);prefs.apply();}private boolean GetPrivacyAccept(){SharedPreferences prefs = this.getSharedPreferences("PlayerPrefs", MODE_PRIVATE);return prefs.getBoolean("PrivacyAccepted", false);}
}

使用离线网页:

使用在线网页:


http://chatgpt.dhexx.cn/article/cpOkEigF.shtml

相关文章

用户隐私保护指引设置~参考案例

文章目录 1. 搜索小程序2. 进入小程序详情3. 更多资料4. 小程序隐私指引5. 具体参考事项 1. 搜索小程序 这里以腾讯文档进行演示 2. 进入小程序详情 3. 更多资料 4. 小程序隐私指引 5. 具体参考事项 以实际的情况为准&#xff0c;这里只是演示

Chrome系浏览器,隐私错误-你的连接不是专用连接

环境 浏览器&#xff1a;Microsoft Edge Dev 92.0.884.2 操作系统&#xff1a;Win10 2004 19041.928 现象 访问不安全不是https的网站&#xff0c;会出现以下警告 解决方案 1.有的网站点开高级后&#xff0c;会出现继续访问的按钮&#xff0c;这种时候直接点击即可。 2.对…

TLS 安全设置未设置为默认设置,这也可能导致此错误。

edge浏览器打开网页时打示“TLS 安全设置未设置为默认设置&#xff0c;这也可能导致此错误。”&#xff0c;如图&#xff1a; 此时可以通过启用TLS功能处理该问题。控制面板-Internet选项-高级。如图&#xff1a; 启用TLS功能后刷新页面或重启浏览器。之后就不会提示之前的报…

Chrome访问HTTPS提示您的连接不是私密连接

谷歌浏览器隐私设置错误 NET::ERR_CERT_AUTHORITY_INVALID 攻击者可能会试图从 xx 窃取您的信息&#xff08;例如&#xff1a;密码、通讯内容或信用卡信息&#xff09;。 谷歌浏览器访问 https 提示您的连接不是私密连接 - 隐私设置错误 如图所示&#xff1a; ​ 点击 继续前…

edge隐私错误“你的连接不是专用连接”解决方案

新电脑自带edge&#xff0c;索性就用edge了。使用过程中发现时不时报错&#xff0c;如下图&#xff1a; 先说我发现的可能凑效的解决方案&#xff08;简单粗暴&#xff09;&#xff1a; 进入edge设置&#xff0c;找到安全性一栏&#xff0c;把这部分功能都关闭&#xff0c;再在…

【错误记录】Google Play 上架报错 ( 对于在 APK 中使用该权限的应用,您必须设置隐私权政策 | 生成并托管 隐私政策 )

文章目录 一、报错信息二、解决方案1、生成隐私政策2、托管隐私政策页面3、Google Play 设置隐私政策 一、报错信息 在 Google Play 中 , 管理并创建内部测试版本 , 上传完毕后 , 检查版本时 , 出现 您的应用所用的 APK&#xff08;版本代码&#xff1a;1&#xff09;会请求以…

Chrome隐私设置错误,您的链接不是私密连接

Chrome浏览器访问https网站时&#xff0c;报&#xff1a; 隐私设置错误&#xff0c;您的链接不是私密连接&#xff0c;服务器证书无效 解决方案 删除Chrome 的 Web Data 配置文件&#xff0c;重启Chrome浏览器 路径&#xff1a;C:\Users\Administrator\AppData\Local\Googl…

关于Google您的连接不是私密连接问题的解决方法 (Chrome 地址栏 Google 搜索错误处理 隐私设置错误)

关于Google您的连接不是私密连接问题的解决方法 &#xff08;Chrome 地址栏 Google 搜索错误处理 隐私设置错误&#xff09; 法一&#xff1a;在谷歌浏览器界面输入“thisisunsafe”&#xff0c;注意不是地址栏输入而是任意的点击键盘就好啦~~不行的话就法二 法二&#xff1a;转…

关于访问github时出现隐私设置错误您的连接不是私密连接问题的解决方案

关于访问github时出现隐私设置错误您的连接不是私密连接问题的解决方案 为了更快的访问github网站&#xff0c;一般都会在hosts文件中加入github.com对应的ip地址。 但在加入值之后可能会出现下图中的情况 查看证书会发现这样一个问题 我查看百度几乎所有解决方案都没有效果…

关于谷歌浏览器显示隐私设置错误的解决方案

问题如下: 问题出现缘由: 使用了抓包工具Fiddle等或开启了某些广告过滤的软件进行截取HTTP请求, 进行窃取数据开启了局域网代理 网络错误或者网络攻击 解决方案: 关闭当前使用的抓包工具(有时候项目开发需要获取网络上的图片时也会被拦截,导致获取图片失败)取消代理服务器…

访问github时出现隐私设置错误您的连接不是私密连接问题的解决方案

为了更快的访问github网站&#xff0c;一般都会在hosts文件中加入github.com对应的ip地址。 但在加入值之后可能会出现下图中的情况: 查看证书会发现这样一个问题: 我查看百度几乎所有解决方案都没有效果&#xff0c;甚至一度怀疑被中间人攻击&#xff0c;到处查找证书的信息…

github连接显示隐私设置错误的解决方案

连接错误解决方案 问题&#xff1a; 在浏览器登录github网址&#xff0c;https://github.com&#xff0c;访问连接错误。解决步骤 1、打开 https://www.ipaddress.com/&#xff0c;查找相关IP 输入github.com 查找对应的ip &#xff1a; 140.82.112.4 输入github.global.ssl.…

单喇叭低成本蓝牙音箱解决方案

单喇叭低成本蓝牙音箱解决方案 1.蓝牙模块&#xff1a;RB102&#xff08;蓝牙3.0&#xff09; 2.蓝牙协议&#xff1a;音乐播放&#xff08;A2DP&#xff09;、免提通话&#xff08;HFP&#xff09; 3.实现功能&#xff1a;开/关机、音量控制、来电接听、来电转移、拒绝来电、…

高音质高性价比蓝牙音箱解决方案

高音质高性价比蓝牙音箱解决方案 1.蓝牙模块&#xff1a;RB103&#xff08;蓝牙4.0&#xff09; 2.蓝牙协议&#xff1a;音乐播放&#xff08;A2DP&#xff09;、流媒体控制&#xff08;AVRCP&#xff09;、免提通话&#xff08;HFP&#xff09; 3.实现功能&#xff1a;开/关机…

JL 杰理 AC692N系列TWS 蓝牙音箱 开发

一、简要说明 随着时间的推移&#xff0c;TWS蓝牙技术也广泛应用于音箱当中&#xff0c;主要采用relay转发模式。目前杰理公司所推出针对音箱方案的是AC692N系列&#xff0c;也必将成为今后一年内的音箱产品的主选方案。 二、开发细节 &#xff08;一&#xff09;连接方式选择 …

蓝牙音响DIY

蓝牙音箱 蓝牙音箱1.0 目的&#xff1a;自己动手做一个蓝牙音箱 材料&#xff1a;蓝牙解码器、功放板、两个扬声器、12V电源适配器。 工具&#xff1a;电络铁&#xff0c;焊锡丝。 蓝牙解码器 这个某宝上随便都可以搜到的&#xff0c;价钱在10块钱以内。 车载音箱功放蓝牙…

Type-C蓝牙音箱单口可充可OTG方案

目前市面上的蓝牙音箱大多仍然还是采用USB-micro接口&#xff0c;充电功率只有5-10W&#xff0c;不仅充电效率慢&#xff0c;而且蓝牙音箱想接U盘还要多设置一个USB-A母座&#xff0c;加上TF卡槽&#xff0c;3.5MM耳机接口&#xff0c;显得多而繁杂。 虽然现在有不少厂商也采用…

蓝牙音箱项目:记录CSR8635芯片的蓝牙音箱的开发过程

翻出了几年前的蓝牙音箱板子&#xff0c;记录CSR8635芯片的蓝牙音箱的开发过程 可以把这个项目分成三部分&#xff1a; 蓝牙模块4L开发 地线和电源的完整性&#xff0c;RF性能和电磁性能&#xff1b;低的线路阻抗,板载蓝牙天线&#xff0c;BQB认证.128K的EEPROM. ■ 支持A2DP&…

改造一个蓝牙小音箱,用于现场输出音频信号

简 介&#xff1a; 通过对小型蓝牙音箱的改造&#xff0c; 使其成为音频信号源。 为超声波定向传送声音提供信号。 经过测试发现需要在原来的555调制信号输入端口引入RC低通滤波器&#xff0c;才能够避免信号发送系统振荡。 关键词&#xff1a; 蓝牙音箱&#xff0c;超声波 #me…

DIY蓝牙小音响

PRE 我个人是比较喜欢手工做一些小东西&#xff0c;但是由于知识限制&#xff0c;我无法去制作一些复杂的东西&#xff0c;如果是一些简单的小玩具&#xff0c;如果我有能力做&#xff0c;我还是很乐意去做的。前段时间正好在看音响&#xff0c;我最后入手了一个便宜的EDIFIER…