优化广告隐私政策提示框显示UI。

This commit is contained in:
2025-11-27 19:12:41 +08:00
parent 1359ce52fd
commit 409ea06f75
4 changed files with 208 additions and 35 deletions

View File

@@ -1,8 +1,8 @@
#Created by .winboll/winboll_app_build.gradle
#Thu Nov 27 13:20:34 HKT 2025
#Thu Nov 27 11:11:09 GMT 2025
stageCount=8
libraryProject=libaes
baseVersion=15.11
publishVersion=15.11.7
buildCount=0
buildCount=4
baseBetaVersion=15.11.8

View File

@@ -1,8 +1,8 @@
#Created by .winboll/winboll_app_build.gradle
#Thu Nov 27 13:19:41 HKT 2025
#Thu Nov 27 11:11:09 GMT 2025
stageCount=8
libraryProject=libaes
baseVersion=15.11
publishVersion=15.11.7
buildCount=0
buildCount=4
baseBetaVersion=15.11.8

View File

@@ -2,32 +2,39 @@ package cc.winboll.studio.libaes.views;
import android.app.Activity;
import android.content.Context;
import android.content.DialogInterface;
import android.content.Intent;
import android.content.SharedPreferences;
import android.net.Uri;
import android.os.Handler;
import android.os.Looper;
import android.os.Message;
import android.text.TextUtils;
import android.text.method.LinkMovementMethod;
import android.util.AttributeSet;
import android.view.Display;
import android.view.Gravity;
import android.view.LayoutInflater;
import android.view.View;
import android.view.View.OnClickListener;
import android.view.Window;
import android.view.WindowManager;
import android.widget.Button;
import android.widget.LinearLayout;
import android.widget.RadioButton;
import android.widget.RadioGroup;
import android.widget.TextView;
import android.widget.Toast;
import androidx.appcompat.app.AlertDialog;
import cc.winboll.studio.libaes.R;
import cc.winboll.studio.libaes.enums.ADsMode;
import cc.winboll.studio.libaes.enums.PrivacyAgreeStatus;
import cc.winboll.studio.libaes.views.ADsControlView;
import cc.winboll.studio.libappbase.LogUtils;
import cc.winboll.studio.libappbase.ToastUtils;
import com.miui.zeus.mimo.sdk.MimoCustomController;
import com.miui.zeus.mimo.sdk.MimoLocation;
import com.miui.zeus.mimo.sdk.MimoSdk;
import cc.winboll.studio.libappbase.ToastUtils;
import cc.winboll.studio.libaes.enums.PrivacyAgreeStatus;
import android.text.Html;
/**
* @Author ZhanGSKen&豆包大模型<zhangsken@qq.com>
@@ -141,11 +148,13 @@ public class ADsControlView extends LinearLayout {
@Override
public void onAgreePrivacy() {
setADsMode(ADsMode.MIMO_SDK);
setSelectedMode(ADsMode.MIMO_SDK);
}
@Override
public void onDisagreePrivacy() {
setADsMode(ADsMode.STANDALONE);
setSelectedMode(ADsMode.STANDALONE);
}
});
}
@@ -225,32 +234,10 @@ public class ADsControlView extends LinearLayout {
return;
} else {
LogUtils.i(TAG, "开始弹出隐私协议...");
AlertDialog.Builder builder = new AlertDialog.Builder(activity);
builder.setTitle("用户须知");
builder.setMessage("小米广告SDK隐私政策: https://dev.mi.com/distribute/doc/details?pId=1688, 请复制到浏览器查看");
builder.setIcon(R.drawable.ic_launcher);
builder.setCancelable(false); // 点击对话框以外的区域不消失
builder.setPositiveButton("同意", new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
SharedPreferences sp = getPrivacySharedPreferences(activity);
sp.edit().putString(PRIVACY_VALUE, String.valueOf(1)).apply();
initMimoSdkStatic(activity.getApplicationContext());
dialog.dismiss();
onPrivacyChangeListener.onAgreePrivacy();
}
});
builder.setNegativeButton("拒绝", new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
SharedPreferences sp = getPrivacySharedPreferences(activity);
sp.edit().putString(PRIVACY_VALUE, String.valueOf(0)).apply();
ADsControlView.updateAdsModeByStatic(activity.getApplicationContext(), ADsMode.STANDALONE);
dialog.dismiss();
onPrivacyChangeListener.onDisagreePrivacy();
}
});
AlertDialog dialog = builder.create();
// 2. 替换后的XML布局对话框代码核心逻辑
AlertDialog dialog = createPrivacyDialog(activity, onPrivacyChangeListener);
dialog.show();
// 配置弹窗位置(底部全屏)
Window window = dialog.getWindow();
@@ -477,9 +464,116 @@ public class ADsControlView extends LinearLayout {
void onModeSelected(ADsMode selectedMode);
}
// 1. 先定义隐私协议变更监听接口(若已定义可忽略)
public interface OnPrivacyChangeListener {
void onAgreePrivacy();
void onDisagreePrivacy();
void onAgreePrivacy(); // 同意隐私协议回调
void onDisagreePrivacy();// 拒绝隐私协议回调
}
// 3. 修复创建隐私协议对话框XML布局版解决inflation崩溃
private static AlertDialog createPrivacyDialog(final Activity activity, final OnPrivacyChangeListener onPrivacyChangeListener) {
// 1. 加载自定义XML布局修复避免解析<a>标签崩溃)
View dialogView = LayoutInflater.from(activity).inflate(R.layout.dialog_privacy_agreement, null);
// 2. 初始化对话框(无标题,使用自定义布局标题)
AlertDialog.Builder builder = new AlertDialog.Builder(activity);
builder.setView(dialogView)
.setCancelable(false); // 点击外部不消失
final AlertDialog dialog = builder.create();
// 3. 初始化控件修复绑定链接TextView替代<a>标签)
final TextView tvPrivacyUrl = (TextView) dialogView.findViewById(R.id.tv_privacy_url);
Button btnAgree = (Button) dialogView.findViewById(R.id.btn_agree);
Button btnDisagree = (Button) dialogView.findViewById(R.id.btn_disagree);
// 4. 修复设置链接TextView可点击 + 蓝色下划线样式(模拟网页链接)
// 4.1 设置下划线文本
tvPrivacyUrl.setText(Html.fromHtml("<u>" + tvPrivacyUrl.getText().toString() + "</u>"));
// 4.2 设置点击事件,调用系统浏览器
tvPrivacyUrl.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
String url = tvPrivacyUrl.getText().toString().trim();
openUrlInBrowser(activity, url);
}
});
// 4.3 设置点击反馈(可选,提升交互)
tvPrivacyUrl.setClickable(true);
tvPrivacyUrl.setFocusable(true);
// 5. 同意按钮点击事件(不变)
btnAgree.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
// // 存储隐私协议状态(枚举+String兼容
// SharedPreferences sp = getPrivacySharedPreferences(activity);
// sp.edit()
// .putString(PRIVACY_VALUE, String.valueOf(PrivacyAgreeStatus.AGREED.getStatusCode()))
// .apply();
// // 初始化米盟SDK
// initMimoSdkStatic(activity.getApplicationContext());
// 回调外部监听
if (onPrivacyChangeListener != null) {
onPrivacyChangeListener.onAgreePrivacy();
}
dialog.dismiss();
}
});
// 6. 拒绝按钮点击事件(不变)
btnDisagree.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
// // 存储隐私协议状态
// SharedPreferences sp = getPrivacySharedPreferences(activity);
// sp.edit()
// .putString(PRIVACY_VALUE, String.valueOf(PrivacyAgreeStatus.REJECTED.getStatusCode()))
// .apply();
// // 更新广告模式为单机模式
// ADsControlView.updateAdsModeByStatic(activity.getApplicationContext(), AdsMode.STANDALONE);
// 回调外部监听
if (onPrivacyChangeListener != null) {
onPrivacyChangeListener.onDisagreePrivacy();
}
dialog.dismiss();
}
});
// 7. 配置对话框样式(底部全屏,与原逻辑一致)
Window window = dialog.getWindow();
if (window != null) {
window.setGravity(Gravity.BOTTOM);
WindowManager m = activity.getWindowManager();
Display d = m.getDefaultDisplay();
WindowManager.LayoutParams p = window.getAttributes();
p.width = d.getWidth(); // 宽度全屏
window.setAttributes(p);
}
return dialog;
}
// 4. 不变调用系统默认浏览器打开链接Java 7 兼容)
private static void openUrlInBrowser(Context context, String url) {
if (context == null || TextUtils.isEmpty(url)) {
LogUtils.e(TAG, "openUrlInBrowser: Context or Url is null");
return;
}
try {
// 构建浏览器意图
Intent browserIntent = new Intent(Intent.ACTION_VIEW, Uri.parse(url));
// 确保有应用可处理该意图(避免崩溃)
if (browserIntent.resolveActivity(context.getPackageManager()) != null) {
context.startActivity(browserIntent);
} else {
Toast.makeText(context.getApplicationContext(), "未找到可用的浏览器", Toast.LENGTH_SHORT).show();
LogUtils.e(TAG, "openUrlInBrowser: No browser app found");
}
} catch (Exception e) {
LogUtils.e(TAG, "openUrlInBrowser: Open url failed", e);
Toast.makeText(context.getApplicationContext(), "打开链接失败,请手动复制链接浏览", Toast.LENGTH_SHORT).show();
}
}
}

View File

@@ -0,0 +1,79 @@
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="vertical"
android:padding="20dp"
android:background="@android:color/white">
<!-- 标题 -->
<TextView
android:id="@+id/tv_dialog_title"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="用户须知"
android:textSize="18sp"
android:textColor="@android:color/black"
android:textStyle="bold"
android:layout_marginBottom="16dp" />
<!-- 内容用LinearLayout横向排列文本+链接替代HTML <a>标签) -->
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="vertical"
android:layout_marginBottom="20dp">
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="小米广告SDK隐私政策: "
android:textSize="14sp"
android:textColor="@android:color/darker_gray" />
<!-- 可点击链接用TextView承载通过代码设置蓝色+下划线) -->
<TextView
android:id="@+id/tv_privacy_url"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="https://dev.mi.com/distribute/doc/details?pId=1688"
android:textSize="14sp"
android:textColor="@android:color/holo_blue_light" />
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text=",点击链接查看完整政策"
android:textSize="14sp"
android:textColor="@android:color/darker_gray" />
</LinearLayout>
<!-- 按钮容器(水平排列) -->
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="horizontal"
android:gravity="end">
<Button
android:id="@+id/btn_disagree"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="拒绝"
android:textSize="14sp"
android:layout_marginRight="12dp"
android:paddingLeft="24dp"
android:paddingRight="24dp" />
<Button
android:id="@+id/btn_agree"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="同意"
android:textSize="14sp"
android:paddingLeft="24dp"
android:paddingRight="24dp" />
</LinearLayout>
</LinearLayout>