优化广告隐私政策提示框显示UI。
This commit is contained in:
@@ -1,8 +1,8 @@
|
|||||||
#Created by .winboll/winboll_app_build.gradle
|
#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
|
stageCount=8
|
||||||
libraryProject=libaes
|
libraryProject=libaes
|
||||||
baseVersion=15.11
|
baseVersion=15.11
|
||||||
publishVersion=15.11.7
|
publishVersion=15.11.7
|
||||||
buildCount=0
|
buildCount=4
|
||||||
baseBetaVersion=15.11.8
|
baseBetaVersion=15.11.8
|
||||||
|
|||||||
@@ -1,8 +1,8 @@
|
|||||||
#Created by .winboll/winboll_app_build.gradle
|
#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
|
stageCount=8
|
||||||
libraryProject=libaes
|
libraryProject=libaes
|
||||||
baseVersion=15.11
|
baseVersion=15.11
|
||||||
publishVersion=15.11.7
|
publishVersion=15.11.7
|
||||||
buildCount=0
|
buildCount=4
|
||||||
baseBetaVersion=15.11.8
|
baseBetaVersion=15.11.8
|
||||||
|
|||||||
@@ -2,32 +2,39 @@ package cc.winboll.studio.libaes.views;
|
|||||||
|
|
||||||
import android.app.Activity;
|
import android.app.Activity;
|
||||||
import android.content.Context;
|
import android.content.Context;
|
||||||
import android.content.DialogInterface;
|
import android.content.Intent;
|
||||||
import android.content.SharedPreferences;
|
import android.content.SharedPreferences;
|
||||||
|
import android.net.Uri;
|
||||||
import android.os.Handler;
|
import android.os.Handler;
|
||||||
import android.os.Looper;
|
import android.os.Looper;
|
||||||
import android.os.Message;
|
import android.os.Message;
|
||||||
import android.text.TextUtils;
|
import android.text.TextUtils;
|
||||||
|
import android.text.method.LinkMovementMethod;
|
||||||
import android.util.AttributeSet;
|
import android.util.AttributeSet;
|
||||||
import android.view.Display;
|
import android.view.Display;
|
||||||
import android.view.Gravity;
|
import android.view.Gravity;
|
||||||
import android.view.LayoutInflater;
|
import android.view.LayoutInflater;
|
||||||
|
import android.view.View;
|
||||||
|
import android.view.View.OnClickListener;
|
||||||
import android.view.Window;
|
import android.view.Window;
|
||||||
import android.view.WindowManager;
|
import android.view.WindowManager;
|
||||||
|
import android.widget.Button;
|
||||||
import android.widget.LinearLayout;
|
import android.widget.LinearLayout;
|
||||||
import android.widget.RadioButton;
|
import android.widget.RadioButton;
|
||||||
import android.widget.RadioGroup;
|
import android.widget.RadioGroup;
|
||||||
|
import android.widget.TextView;
|
||||||
import android.widget.Toast;
|
import android.widget.Toast;
|
||||||
import androidx.appcompat.app.AlertDialog;
|
import androidx.appcompat.app.AlertDialog;
|
||||||
import cc.winboll.studio.libaes.R;
|
import cc.winboll.studio.libaes.R;
|
||||||
import cc.winboll.studio.libaes.enums.ADsMode;
|
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.libaes.views.ADsControlView;
|
||||||
import cc.winboll.studio.libappbase.LogUtils;
|
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.MimoCustomController;
|
||||||
import com.miui.zeus.mimo.sdk.MimoLocation;
|
import com.miui.zeus.mimo.sdk.MimoLocation;
|
||||||
import com.miui.zeus.mimo.sdk.MimoSdk;
|
import com.miui.zeus.mimo.sdk.MimoSdk;
|
||||||
import cc.winboll.studio.libappbase.ToastUtils;
|
import android.text.Html;
|
||||||
import cc.winboll.studio.libaes.enums.PrivacyAgreeStatus;
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @Author ZhanGSKen&豆包大模型<zhangsken@qq.com>
|
* @Author ZhanGSKen&豆包大模型<zhangsken@qq.com>
|
||||||
@@ -141,11 +148,13 @@ public class ADsControlView extends LinearLayout {
|
|||||||
@Override
|
@Override
|
||||||
public void onAgreePrivacy() {
|
public void onAgreePrivacy() {
|
||||||
setADsMode(ADsMode.MIMO_SDK);
|
setADsMode(ADsMode.MIMO_SDK);
|
||||||
|
setSelectedMode(ADsMode.MIMO_SDK);
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void onDisagreePrivacy() {
|
public void onDisagreePrivacy() {
|
||||||
setADsMode(ADsMode.STANDALONE);
|
setADsMode(ADsMode.STANDALONE);
|
||||||
|
setSelectedMode(ADsMode.STANDALONE);
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
@@ -225,32 +234,10 @@ public class ADsControlView extends LinearLayout {
|
|||||||
return;
|
return;
|
||||||
} else {
|
} else {
|
||||||
LogUtils.i(TAG, "开始弹出隐私协议...");
|
LogUtils.i(TAG, "开始弹出隐私协议...");
|
||||||
AlertDialog.Builder builder = new AlertDialog.Builder(activity);
|
|
||||||
builder.setTitle("用户须知");
|
// 2. 替换后的XML布局对话框代码(核心逻辑)
|
||||||
builder.setMessage("小米广告SDK隐私政策: https://dev.mi.com/distribute/doc/details?pId=1688, 请复制到浏览器查看");
|
AlertDialog dialog = createPrivacyDialog(activity, onPrivacyChangeListener);
|
||||||
builder.setIcon(R.drawable.ic_launcher);
|
dialog.show();
|
||||||
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();
|
|
||||||
|
|
||||||
// 配置弹窗位置(底部全屏)
|
// 配置弹窗位置(底部全屏)
|
||||||
Window window = dialog.getWindow();
|
Window window = dialog.getWindow();
|
||||||
@@ -477,9 +464,116 @@ public class ADsControlView extends LinearLayout {
|
|||||||
void onModeSelected(ADsMode selectedMode);
|
void onModeSelected(ADsMode selectedMode);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// 1. 先定义隐私协议变更监听接口(若已定义可忽略)
|
||||||
public interface OnPrivacyChangeListener {
|
public interface OnPrivacyChangeListener {
|
||||||
void onAgreePrivacy();
|
void onAgreePrivacy(); // 同意隐私协议回调
|
||||||
void onDisagreePrivacy();
|
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();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
79
libaes/src/main/res/layout/dialog_privacy_agreement.xml
Normal file
79
libaes/src/main/res/layout/dialog_privacy_agreement.xml
Normal 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>
|
||||||
|
|
||||||
Reference in New Issue
Block a user