From ce4f23f3f410237ddd3199babfc7be8c8cecc6ad Mon Sep 17 00:00:00 2001 From: BigPickle Date: Tue, 21 Jul 2026 17:38:33 +0800 Subject: [PATCH] =?UTF-8?q?refactor(libappbase+appbase):=20=E6=8F=90?= =?UTF-8?q?=E5=8F=96SMTPConfigView=E6=8E=A7=E4=BB=B6=E5=B9=B6=E6=B7=BB?= =?UTF-8?q?=E5=8A=A0=E5=BC=82=E5=B8=B8=E9=82=AE=E4=BB=B6=E5=8F=91=E9=80=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit libappbase: - 新增SMTPConfigView自定义控件,封装SMTP配置输入/保存/测试发送 - SMTPUtils添加支持自定义host/port的重载方法,sendMail参数化 appbase: - APPExcetionMailSettingsActivity改用SMTPConfigView,删除全部旧控件 - App.onCreate catch块添加sendExceptionMail(),子线程发送异常堆栈邮件 --- appbase/build.properties | 4 +- .../java/cc/winboll/studio/appbase/App.java | 61 +++- .../APPExcetionMailSettingsActivity.java | 143 +-------- .../activity_appexcetionmailsettings.xml | 145 +-------- libappbase/build.properties | 4 +- .../studio/libappbase/utils/SMTPUtils.java | 61 +++- .../libappbase/widget/SMTPConfigView.java | 299 ++++++++++++++++++ 7 files changed, 426 insertions(+), 291 deletions(-) create mode 100644 libappbase/src/main/java/cc/winboll/studio/libappbase/widget/SMTPConfigView.java diff --git a/appbase/build.properties b/appbase/build.properties index fd7ef6e..6259ec4 100644 --- a/appbase/build.properties +++ b/appbase/build.properties @@ -1,8 +1,8 @@ #Created by .winboll/winboll_app_build.gradle -#Tue Jul 21 17:05:50 HKT 2026 +#Tue Jul 21 17:33:50 HKT 2026 stageCount=4 libraryProject=libappbase baseVersion=15.21 publishVersion=15.21.3 -buildCount=6 +buildCount=9 baseBetaVersion=15.21.4 diff --git a/appbase/src/main/java/cc/winboll/studio/appbase/App.java b/appbase/src/main/java/cc/winboll/studio/appbase/App.java index cfd440d..3895eab 100644 --- a/appbase/src/main/java/cc/winboll/studio/appbase/App.java +++ b/appbase/src/main/java/cc/winboll/studio/appbase/App.java @@ -1,9 +1,13 @@ package cc.winboll.studio.appbase; +import android.content.SharedPreferences; + import cc.winboll.studio.libappbase.CrashActivity; import cc.winboll.studio.libappbase.GlobalApplication; +import cc.winboll.studio.libappbase.LogUtils; import cc.winboll.studio.libappbase.ToastUtils; import cc.winboll.studio.libappbase.utils.CrashHandleNotifyUtils; +import cc.winboll.studio.libappbase.utils.SMTPUtils; import java.io.PrintWriter; import java.io.StringWriter; @@ -18,6 +22,9 @@ public class App extends GlobalApplication { /** 当前应用类的日志 TAG(用于调试输出,标识日志来源) */ public static final String TAG = "App"; + /** SMTP配置 SharedPreferences 名称 */ + private static final String PREF_NAME = "smtp_config"; + /** * 应用创建时回调(全局初始化入口) * 在应用进程启动时执行,仅调用一次,用于初始化全局工具类、第三方库等 @@ -41,9 +48,62 @@ public class App extends GlobalApplication { stackTraceStr, CrashActivity.class ); + sendExceptionMail(stackTraceStr); } } + /** + * 发送异常报告邮件 + * 读取SMTP配置,若配置完整则在子线程发送异常堆栈邮件 + * @param stackTraceStr 异常堆栈信息 + */ + private void sendExceptionMail(final String stackTraceStr) { + SharedPreferences sp = getSharedPreferences(PREF_NAME, MODE_PRIVATE); + final String host = sp.getString("smtp_server", ""); + final String portStr = sp.getString("smtp_port", ""); + final String sender = sp.getString("sender_email", ""); + final String auth = sp.getString("auth_code", ""); + final String recipient = sp.getString("recipient_email", ""); + + if (host.isEmpty() || portStr.isEmpty() || sender.isEmpty() + || auth.isEmpty() || recipient.isEmpty()) { + LogUtils.d(TAG, "sendExceptionMail skipped, SMTP config incomplete"); + return; + } + + final int port; + try { + port = Integer.parseInt(portStr); + } catch (NumberFormatException e) { + LogUtils.e(TAG, "sendExceptionMail failed, port format error: " + portStr); + return; + } + + new Thread(new Runnable() { + @Override + public void run() { + String deviceInfo = "\n\n--- Device Info ---\n" + + "Package: " + getPackageName() + "\n" + + "Time: " + System.currentTimeMillis() + "\n"; + + boolean success = SMTPUtils.sendTextMail( + recipient, + "APPBase 异常报告", + stackTraceStr + deviceInfo, + sender, + auth, + host, + port); + + if (success) { + LogUtils.d(TAG, "sendExceptionMail success"); + } else { + LogUtils.e(TAG, "sendExceptionMail failed"); + } + } + }).start(); + } + /** * 应用终止时回调(资源释放入口) * 仅在模拟环境(如 Android Studio 模拟器)中可靠触发,真机上可能因系统回收进程不执行 @@ -56,4 +116,3 @@ public class App extends GlobalApplication { ToastUtils.release(); } } - diff --git a/appbase/src/main/java/cc/winboll/studio/appbase/develop/APPExcetionMailSettingsActivity.java b/appbase/src/main/java/cc/winboll/studio/appbase/develop/APPExcetionMailSettingsActivity.java index bce8126..54eef4a 100644 --- a/appbase/src/main/java/cc/winboll/studio/appbase/develop/APPExcetionMailSettingsActivity.java +++ b/appbase/src/main/java/cc/winboll/studio/appbase/develop/APPExcetionMailSettingsActivity.java @@ -1,162 +1,27 @@ package cc.winboll.studio.appbase.develop; import android.app.Activity; -import android.content.SharedPreferences; import android.os.Bundle; -import android.os.Handler; -import android.os.Looper; -import android.view.View; -import android.widget.Button; -import android.widget.EditText; -import android.widget.Toast; import cc.winboll.studio.appbase.R; -import cc.winboll.studio.libappbase.LogUtils; -import cc.winboll.studio.libappbase.utils.SMTPUtils; +import cc.winboll.studio.libappbase.widget.SMTPConfigView; /** * @Author 豆包&BigPickle&MiMo&ZhanGSKen * @Date 2026/07/21 12:44 * @Describe 应用异常信息邮件接收账号设置 - * 配置SMTP服务器参数,用于通过邮件发送异常报告 + * 使用SMTPConfigView控件配置SMTP服务器参数 */ public class APPExcetionMailSettingsActivity extends Activity { public static final String TAG = "APPExcetionMailSettingsActivity"; - private static final String PREF_NAME = "smtp_config"; - private static final String KEY_SMTP_SERVER = "smtp_server"; - private static final String KEY_SMTP_PORT = "smtp_port"; - private static final String KEY_SENDER_EMAIL = "sender_email"; - private static final String KEY_AUTH_CODE = "auth_code"; - private static final String KEY_RECIPIENT_EMAIL = "recipient_email"; - - private EditText mEtSmtpServer; - private EditText mEtSmtpPort; - private EditText mEtSenderEmail; - private EditText mEtAuthCode; - private EditText mEtRecipientEmail; + private SMTPConfigView mSMTPConfigView; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_appexcetionmailsettings); - mEtSmtpServer = (EditText) findViewById(R.id.et_smtp_server); - mEtSmtpPort = (EditText) findViewById(R.id.et_smtp_port); - mEtSenderEmail = (EditText) findViewById(R.id.et_sender_email); - mEtAuthCode = (EditText) findViewById(R.id.et_auth_code); - mEtRecipientEmail = (EditText) findViewById(R.id.et_recipient_email); - - loadConfig(); - - Button btnSave = (Button) findViewById(R.id.btn_save); - btnSave.setOnClickListener(new View.OnClickListener() { - @Override - public void onClick(View v) { - saveConfig(); - } - }); - - Button btnTest = (Button) findViewById(R.id.btn_test); - btnTest.setOnClickListener(new View.OnClickListener() { - @Override - public void onClick(View v) { - testSendMail(); - } - }); - } - - private void loadConfig() { - SharedPreferences sp = getSharedPreferences(PREF_NAME, MODE_PRIVATE); - String server = sp.getString(KEY_SMTP_SERVER, "smtp.qq.com"); - String port = sp.getString(KEY_SMTP_PORT, "465"); - String sender = sp.getString(KEY_SENDER_EMAIL, ""); - String auth = sp.getString(KEY_AUTH_CODE, ""); - String recipient = sp.getString(KEY_RECIPIENT_EMAIL, ""); - - mEtSmtpServer.setText(server); - mEtSmtpPort.setText(port); - mEtSenderEmail.setText(sender); - mEtAuthCode.setText(auth); - mEtRecipientEmail.setText(recipient); - } - - private void saveConfig() { - String server = mEtSmtpServer.getText().toString().trim(); - String port = mEtSmtpPort.getText().toString().trim(); - String sender = mEtSenderEmail.getText().toString().trim(); - String auth = mEtAuthCode.getText().toString().trim(); - String recipient = mEtRecipientEmail.getText().toString().trim(); - - SharedPreferences.Editor editor = getSharedPreferences(PREF_NAME, MODE_PRIVATE).edit(); - editor.putString(KEY_SMTP_SERVER, server); - editor.putString(KEY_SMTP_PORT, port); - editor.putString(KEY_SENDER_EMAIL, sender); - editor.putString(KEY_AUTH_CODE, auth); - editor.putString(KEY_RECIPIENT_EMAIL, recipient); - editor.apply(); - - Toast.makeText(this, "设置已保存", Toast.LENGTH_SHORT).show(); - LogUtils.d(TAG, "saveConfig success, server=" + server + ", port=" + port + ", sender=" + sender); - } - - private void testSendMail() { - String server = mEtSmtpServer.getText().toString().trim(); - String portStr = mEtSmtpPort.getText().toString().trim(); - String sender = mEtSenderEmail.getText().toString().trim(); - String auth = mEtAuthCode.getText().toString().trim(); - String recipient = mEtRecipientEmail.getText().toString().trim(); - - if (server.isEmpty()) { - Toast.makeText(this, "请输入SMTP服务器地址", Toast.LENGTH_SHORT).show(); - return; - } - if (portStr.isEmpty()) { - Toast.makeText(this, "请输入SMTP端口", Toast.LENGTH_SHORT).show(); - return; - } - if (sender.isEmpty()) { - Toast.makeText(this, "请输入发件人邮箱", Toast.LENGTH_SHORT).show(); - return; - } - if (auth.isEmpty()) { - Toast.makeText(this, "请输入邮箱授权码", Toast.LENGTH_SHORT).show(); - return; - } - if (recipient.isEmpty()) { - Toast.makeText(this, "请输入收件人邮箱", Toast.LENGTH_SHORT).show(); - return; - } - - Toast.makeText(this, "正在发送测试邮件...", Toast.LENGTH_SHORT).show(); - - final String finalRecipient = recipient; - final String finalSender = sender; - final String finalAuth = auth; - - new Thread(new Runnable() { - @Override - public void run() { - final boolean success = SMTPUtils.sendTextMail( - finalRecipient, - "APPBase 测试邮件", - "这是一封来自APPBase的测试邮件。\n\n发送时间: " + System.currentTimeMillis(), - finalSender, - finalAuth); - - new Handler(Looper.getMainLooper()).post(new Runnable() { - @Override - public void run() { - if (success) { - Toast.makeText(APPExcetionMailSettingsActivity.this, - "测试邮件发送成功", Toast.LENGTH_SHORT).show(); - } else { - Toast.makeText(APPExcetionMailSettingsActivity.this, - "测试邮件发送失败,请检查设置", Toast.LENGTH_SHORT).show(); - } - } - }); - } - }).start(); + mSMTPConfigView = (SMTPConfigView) findViewById(R.id.smtp_config_view); } } diff --git a/appbase/src/main/res/layout/activity_appexcetionmailsettings.xml b/appbase/src/main/res/layout/activity_appexcetionmailsettings.xml index bede039..1110504 100644 --- a/appbase/src/main/res/layout/activity_appexcetionmailsettings.xml +++ b/appbase/src/main/res/layout/activity_appexcetionmailsettings.xml @@ -3,148 +3,11 @@ xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="match_parent" - android:background="#FAFAFA" - android:padding="16dp"> + android:background="#FAFAFA"> - + android:layout_height="wrap_content"/> - - - - - - - - - - - - - - - - - - - - - - -