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


    一、环境

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

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

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

    三、方式

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

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

    1、修改AndroidManifest.xml文件

    1. "com.aaa.bbb.PrivacyActivity">
    2. "android.intent.action.MAIN" />
    3. "android.intent.category.LAUNCHER" />
    4. ...

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

           
               
               
           

     2、PrivacyActivity.java源码

    1. package com.aaa.bbb;
    2. import android.app.Activity;
    3. import android.app.AlertDialog;
    4. import android.content.DialogInterface;
    5. import android.content.Intent;
    6. import android.content.SharedPreferences;
    7. import android.content.pm.ActivityInfo;
    8. import android.content.pm.PackageManager;
    9. import android.os.Bundle;
    10. import android.webkit.WebResourceError;
    11. import android.webkit.WebResourceRequest;
    12. import android.webkit.WebView;
    13. import android.webkit.WebViewClient;
    14. public class PrivacyActivity extends Activity implements DialogInterface.OnClickListener {
    15. boolean useLocalHtml = true;//true表示隐私协议对话框显示的内容使用本地html文本;false则使用远程网页内容
    16. String privacyUrl = "https://blog.csdn.net/nmg10";//远程网页内容
    17. final String htmlStr = "欢迎使用本游戏,在使用本游戏前,请您充分阅读并理解《隐私政策》的条款,了解我们对于个人信息的处理规则和权限申请的目的,特别提醒您注意前述协议中关于\n" +
    18. "我们免除自身责任,限制您的权力的相关条款及争议解决方式,司法管辖等内容。我们将严\n" +
    19. "格遵守相关法律法规和隐私政策以保护您的个人隐私。为确保您的游戏体验,我们会向您申请以下必要权限,您可选择同意或者拒绝,拒绝可能会导致无法进入本游戏。同时,我们会根据本游戏中相关功能的具体需要向您申请非必要的权限,您可选择同意或者拒绝,拒绝可能会导致部分游戏体验异常。其中必要权限包括:设备权限(必要):读取唯一设备标识 (AndroidID、mac),生成帐号、保存和恢复游戏数据,识别异常状态以及保障网络及运营安全。存储权限(必要):访问您的存储空间,以便使您可以下载并保存内容、图片存储及上传、个人设置信息缓存读写、系统及日志文件创建。\n";
    20. @Override
    21. protected void onCreate(Bundle savedInstanceState) {
    22. super.onCreate(savedInstanceState);
    23. ActivityInfo actInfo = null;
    24. try {
    25. //获取AndroidManifest.xml配置的元数据
    26. actInfo = this.getPackageManager().getActivityInfo(getComponentName(), PackageManager.GET_META_DATA);
    27. useLocalHtml = actInfo.metaData.getBoolean("useLocalHtml");
    28. privacyUrl = actInfo.metaData.getString("privacyUrl");
    29. } catch (PackageManager.NameNotFoundException e) {
    30. e.printStackTrace();
    31. }
    32. //如果已经同意过隐私协议则直接进入Unity Activity
    33. if (GetPrivacyAccept()){
    34. EnterUnityActivity();
    35. return;
    36. }
    37. ShowPrivacyDialog();//弹出隐私协议对话框
    38. }
    39. @Override
    40. public void onClick(DialogInterface dialogInterface, int i) {
    41. switch (i){
    42. case AlertDialog.BUTTON_POSITIVE://点击同意按钮
    43. SetPrivacyAccept(true);
    44. EnterUnityActivity();//启动Unity Activity
    45. break;
    46. case AlertDialog.BUTTON_NEGATIVE://点击拒绝按钮,直接退出App
    47. finish();
    48. break;
    49. }
    50. }
    51. private void ShowPrivacyDialog(){
    52. WebView webView = new WebView(this);
    53. if (useLocalHtml){
    54. webView.loadDataWithBaseURL(null, htmlStr, "text/html", "UTF-8", null);
    55. }else{
    56. webView.loadUrl(privacyUrl);
    57. webView.setWebViewClient(new WebViewClient(){
    58. @Override
    59. public boolean shouldOverrideUrlLoading(WebView view, String url) {
    60. view.loadUrl(url);
    61. return true;
    62. }
    63. @Override
    64. public void onReceivedError(WebView view, WebResourceRequest request, WebResourceError error) {
    65. view.reload();
    66. }
    67. @Override
    68. public void onPageFinished(WebView view, String url) {
    69. super.onPageFinished(view, url);
    70. }
    71. });
    72. }
    73. AlertDialog.Builder privacyDialog = new AlertDialog.Builder(this);
    74. privacyDialog.setCancelable(false);
    75. privacyDialog.setView(webView);
    76. privacyDialog.setTitle("隐私政策");
    77. privacyDialog.setNegativeButton("退出",this);
    78. privacyDialog.setPositiveButton("同意",this);
    79. privacyDialog.create().show();
    80. }
    81. //启动Unity Activity
    82. private void EnterUnityActivity(){
    83. Intent unityAct = new Intent();
    84. unityAct.setClassName(this, "com.aaa.bbb.UnityPlayerActivity");
    85. this.startActivity(unityAct);
    86. }
    87. //保存同意隐私协议状态
    88. private void SetPrivacyAccept(boolean accepted){
    89. SharedPreferences.Editor prefs = this.getSharedPreferences("PlayerPrefs", MODE_PRIVATE).edit();
    90. prefs.putBoolean("MY_PrivacyAccepted", accepted);
    91. prefs.apply();
    92. }
    93. private boolean GetPrivacyAccept(){
    94. SharedPreferences prefs = this.getSharedPreferences("PlayerPrefs", MODE_PRIVATE);
    95. return prefs.getBoolean("MY_PrivacyAccepted", false);
    96. }
    97. }

    3、离线网页效果:

  • 相关阅读:
    LeetCode(Python)—— 杨辉三角(简单)
    池化层的实现
    This download does NOT match an earlier download recorded in go.sum.
    cocosCreator 之 crypto-es数据加密
    基于SSM+MySQL+VUE前后端分离的学生成绩教务信息管理系统
    Flink 运行时架构(三)
    【linux编程】linux文件IO的系统函数及其示例(open/openat/lseek/write)
    C++初阶(vector容器+模拟实现)
    PyTorch实例:简单线性回归的训练和反向传播解析
    【20220629】【信号处理】(平稳随机信号)自相关函数性质的证明过程
  • 原文地址:https://blog.csdn.net/nmg10/article/details/133748967