关于:未同意隐私政策,应用获取ANDROID ID问题2

news2024/9/22 15:35:18

一、环境

Unity2018 4.21f1、Android Studio、Windows10
二、问题描述

在发布应用到华为应用市场时,提示“在用户同意隐私政策前,您的应用获取了用户的ANDROID ID,不符合华为应用市场审核标准。”

如果你想去掉获取ANDROID ID的代码可以参考:关于:未同意隐私政策,应用获取ANDROID ID问题-CSDN博客

三、方式

如果尝试过各种方式,都无法去除,那就加一个启动页来做 隐私政策 提示。

举例:项目包名com.aaa.bbb

1、修改AndroidManifest.xml文件

<application>
    <activity android:name="com.aaa.bbb.PrivacyActivity">
        <intent-filter>
            <action android:name="android.intent.action.MAIN" />
            <category android:name="android.intent.category.LAUNCHER" />
        </intent-filter>
    </activity>
...
</application>

注意:你自己Activity中的下面代码要去掉

       <intent-filter>
            <action android:name="android.intent.action.MAIN" />
            <category android:name="android.intent.category.LAUNCHER" />
        </intent-filter>

 2、PrivacyActivity.java源码

package com.aaa.bbb;
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;//true表示隐私协议对话框显示的内容使用本地html文本;false则使用远程网页内容
    String privacyUrl = "https://blog.csdn.net/nmg10";//远程网页内容

    final String htmlStr = "欢迎使用本游戏,在使用本游戏前,请您充分阅读并理解<a href=\"https://blog.csdn.net/nmg10\">《隐私政策》</a>的条款,了解我们对于个人信息的处理规则和权限申请的目的,特别提醒您注意前述协议中关于\n" +
            "我们免除自身责任,限制您的权力的相关条款及争议解决方式,司法管辖等内容。我们将严\n" +
            "格遵守相关法律法规和隐私政策以保护您的个人隐私。为确保您的游戏体验,我们会向您申请以下必要权限,您可选择同意或者拒绝,拒绝可能会导致无法进入本游戏。同时,我们会根据本游戏中相关功能的具体需要向您申请非必要的权限,您可选择同意或者拒绝,拒绝可能会导致部分游戏体验异常。其中必要权限包括:设备权限(必要):读取唯一设备标识 (AndroidID、mac),生成帐号、保存和恢复游戏数据,识别异常状态以及保障网络及运营安全。存储权限(必要):访问您的存储空间,以便使您可以下载并保存内容、图片存储及上传、个人设置信息缓存读写、系统及日志文件创建。\n";
 
    @Override
    protected 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 Activity
        if (GetPrivacyAccept()){
            EnterUnityActivity();
            return;
        }
        ShowPrivacyDialog();//弹出隐私协议对话框
    }
 
    @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;
        }
    }
    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(){
                @Override
                public boolean shouldOverrideUrlLoading(WebView view, String url) {
                    view.loadUrl(url);
                    return true;
                }
 
                @Override
                public void onReceivedError(WebView view, WebResourceRequest request, WebResourceError error) {
                    view.reload();
                }
 
                @Override
                public 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("隐私政策");
        privacyDialog.setNegativeButton("退出",this);
        privacyDialog.setPositiveButton("同意",this);
        privacyDialog.create().show();
    }
//启动Unity Activity
    private void EnterUnityActivity(){
        Intent unityAct = new Intent();
        unityAct.setClassName(this, "com.aaa.bbb.UnityPlayerActivity");
        this.startActivity(unityAct);
    }
//保存同意隐私协议状态
    private void SetPrivacyAccept(boolean accepted){
        SharedPreferences.Editor prefs = this.getSharedPreferences("PlayerPrefs", MODE_PRIVATE).edit();
        prefs.putBoolean("MY_PrivacyAccepted", accepted);
        prefs.apply();
    }
    private boolean GetPrivacyAccept(){
        SharedPreferences prefs = this.getSharedPreferences("PlayerPrefs", MODE_PRIVATE);
        return prefs.getBoolean("MY_PrivacyAccepted", false);
    }
}

3、离线网页效果:

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

佳音通讯400电话在线选号服务

随着互联网的快速发展&#xff0c;越来越多的企业开始意识到电话营销的重要性。作为一种直接、高效的沟通方式&#xff0c;电话营销在企业推广和销售中发挥着重要的作用。然而&#xff0c;很多企业在选择电话号码时遇到了困扰&#xff0c;不知道如何选择一个好记、好用的号码。…

工作相关----《系统部署相关操作》

(1)修改带外IP地址 修改完成后&#xff0c;再重新使用新的带外IP登录下试试&#xff0c;确保IP修改成功&#xff1b; (2)确认物理端口对应的配置文件&#xff1b; 进入远程控制台&#xff0c;确认“业务主&#xff0c;业务备&#xff0c;备份主&#xff0c;备份备”网络端口&…

项目文件上传到行云codeup teambition

接手公司好几年的老项目&#xff0c;在行云上已经有1.9G的大小所以被限制上传了 只有花钱扩容或者重新建库。 1.重新建库&#xff1a;登录你的行云账户在代码库中新建代码库&#xff08;网上有详细的&#xff09; 创建成功后的库中只有readme文件。 2.复制代码库的下载地址 …

第六章-完善内核

Ⅰ.函数调用约定 首先&#xff0c;函数调用在处理器执行过程中实际是栈的切换&#xff0c;从当前执行任务的栈切换到另一个栈&#xff0c;但是切换过程中涉及到参数传递方式、参数传递顺序、栈的销毁等&#xff0c;因此在切换过程中需要明确函数调用约定。 根据下面表可看出在…

linux后台运行java项目/ jar包:nohup 命令

1.提出问题 我们把一个 SpringBoot 工程导出为 jar 包&#xff0c;jar 包上传到阿里云 ECS 服务器上&#xff0c;使用 java -jar xxx-xxx.jar 命令启动这个 SpringBoot 程序。此时我们本地的 xshell 客户端必须一直开着&#xff0c;一旦 xshell 客户端关闭&#xff0c;java -j…

Gin,Gorm实现Web计算器

目录 仓库链接0.PSP表格1. 成品展示1.基础运算2. 清零回退3.错误提示4.历史记录拓展功能1.前端可修改的利率计算器2.科学计算器3. 按钮切换不同计算器模式4.用户在一次运算后不清零继续输入操作符&#xff0c;替换表达式为上次答案 2.设计实现过程3.代码说明4.心路历程和收获 仓…

大模型/LLM的涌现能力

新浪张俊林–中国人工智能学会演讲 文章目录 什么是大模型的涌现能力LLM表现的涌现能力1. In Context Learning -- 情景学习2. CoT3. 其他涌现能力 LLM模型规模和涌现能力的关系模型训练中的顿悟现象&#xff1a;GrokkingLLM涌现能力的可能原因 什么是大模型的涌现能力 涌现&a…

message“: “CSRF token mismatch

tableData&#xff0c;noticeData 是两个长二维数组 $.ajax({url: "/admin/samproofing/confirmPieces",type: "POST",data: {"ym": ym1,"papertype":paper_type,"person_data": that.tableData,"notice_data": t…

Servlet入门

URL和URI&#xff1a; URL统一资源定位符&#xff0c;表示对外暴露的整个网址 URI统一资源标示符&#xff0c;表示资源的访问路径&#xff0c;与servlet绑定的地址 HTTP请求结构&#xff1a; HTTP请求包含三部分&#xff1a;请求行、请求头、请求体 请求行包含&#xff1a;请…

被替换掉的文件如何找回来?

当我们在编辑文件时&#xff0c;通常会直接保存而不是另存为新文件&#xff0c;这样会替换原始文件的信息。如果需要对原始文件进行二次编辑&#xff0c;情况就会比较复杂。那么被替换掉的文件还能找回来吗&#xff1f; 被替换的文件是否可以恢复&#xff1f; 这取决于替换原始…

【论文笔记】A theory of learning from different domains

防盗 https://www.cnblogs.com/setdong/p/17756127.html domain adaptation 领域理论方向的重要论文. 这篇笔记主要是推导文章中的定理, 还有分析定理的直观解释. 笔记中的章节号与论文中的保持一致. 1. Introduction domain adaptation 的设定介绍: 有两个域, source domain…

智慧空开让用电更安全、管理更智能——电脑APP远程控制开合闸

安科瑞 崔丽洁 01 什么是低压断路器&#xff1f;低压断路器的定义是&#xff1a;能够接通、承载及分断正常电路条件下的电流&#xff0c;也能在规定的非正常电路条件&#xff08;过载、短路、特别是短路&#xff09;下接通、承载一定时间和分断电流的开关电器。 断路器的分类&…

go语言教程4:switch和map

文章目录 switchswitch匹配字典 go语言教程&#xff1a;安装入门➡️for循环➡️数组、切片和指针 switch和map&#xff0c;一个是控制流&#xff0c;一个是数据结构&#xff0c;之所以把两个不同类型的知识点放在一起讲解&#xff0c;是因为二者有着极其相似的运行逻辑&#…

WSL+vscode配置miniob环境

1.配置WSL Windows Subsystem for Linux入门&#xff1a;安装配置图形界面中文环境vscode wu-kan 2.获取源码 找个位置Git Bash然后拉取代码 git clone https://github.com/oceanbase/miniob.git 3.安装相关依赖 https://gitee.com/liangcha-xyy/source/blob/master/how…

Spring Boot Bean 注入的常用方式教程

Spring Boot Bean 注入是一种将依赖对象引入到应用程序组件中的机制&#xff0c;它有助于实现松耦合和可测试的代码。这种注入方式允许我们将依赖关系委托给 Spring 容器来管理&#xff0c;从而提高了代码的可维护性和可读性。Spring Boot 提供了多种 Bean 注入方式&#xff0c…

qt判断当前日期的当月的最后一天是几号

1、拖个dateTimeEdit在界面上&#xff0c;同时来判断输入的时间的最后一天的日期是什么&#xff1f; int year,month;int monthArr[12]{31,28,31,30,31,30,31,31,30,31,30,31};QDateTime time ui->dateTimeEdit->dateTime();year time.toString("yyyy").toIn…

C++入门介绍

1.C入门知识 以下是一些 C 入门知识&#xff1a; C 是一种面向对象的编程语言&#xff0c;它具有高效、灵活、可移植性好等特点 C 中的基本数据类型包括整型、浮点型、字符型等 C 中的控制语句包括条件语句&#xff08;if、else&#xff09;、循环语句&#xff08;for、while、…

飞凌嵌入式成为“龙芯生态伙伴计划”认证级企业!

近日&#xff0c;飞凌嵌入式正式成为“龙芯生态伙伴计划”认证企业&#xff0c;标志着飞凌嵌入式与龙芯中科的紧密型战略合作伙伴关系正式建立&#xff01; “龙芯生态伙伴计划”由龙芯中科主导发起&#xff0c;旨在推动龙芯生态企业基于龙芯平台开发产品&#xff0c;丰富龙芯…

MyBatisPlus属性自动填充和乐观锁插件+查询删除操作+整合SpringBoot出现问题解决

属性字段自动填充 一、实体类和数据表添加两个字段&#xff08;属性&#xff09; 表&#xff1a;create_tiem/update_time 实体类&#xff1a;createTime/updateTime 二、实体类中属性进行注解添加 TableField(fillFieldFill.INSERT) private Date createTime;TableField(f…

DC2DC电源设计注意事项--1,Feedback

电源采集图如下图 Feedback 采集电压点应该在靠近负载侧。这样可以减少大电流导线导致的电压差&#xff0c;真实反应输出电压值 FB_1P21采集电路靠近芯片侧&#xff0c; 2.1&#xff0c;采集分压电路上侧为Vout Vnoise, 那么一分压就噪声就小了。假如采集电路远离芯片侧&…