diff --git a/app/src/main/assets/print_demo.html b/app/src/main/assets/print_demo.html index 92818df..7199f10 100644 --- a/app/src/main/assets/print_demo.html +++ b/app/src/main/assets/print_demo.html @@ -473,6 +473,14 @@ // 延迟检测 setTimeout(checkApp, 300); + // 同步 PTT 登录状态 + setTimeout(function() { + if (window.android && window.android.pttGetLoginStatus) { + var status = window.android.pttGetLoginStatus(); + var loginId = window.android.pttGetLoginId ? window.android.pttGetLoginId() : ""; + updatePttLoginStatus(status, loginId); + } + }, 500); // 告知 Android 页面加载完成 window.onload = function() { @@ -670,22 +678,37 @@ // PTT 登录成功回调 (由 Android 调用) function onPttLoginSuccess() { - pttStatusTag.innerText = "PTT 已登录"; - pttStatusTag.className = "ws-status ws-connected"; - - // 激活按钮 - pttBtn.disabled = false; - pttBtn.style.background = "#ef4444"; - pttBtn.style.cursor = "pointer"; - - var actionBtns = document.querySelectorAll('.ptt-action-btn'); - for (var i = 0; i < actionBtns.length; i++) { - actionBtns[i].disabled = false; - } - + updatePttLoginStatusUI("02"); showPttResult("PTT 业务初始化成功,对讲功能已就绪"); } + // 更新 PTT 登录状态 (由 Android 实时推送) + window.updatePttLoginStatus = function(status, loginId) { + updatePttLoginStatusUI(status); + var statusMap = { "00": "未登录", "01": "登录中...", "02": "已登录" }; + showPttResult("登录状态变更: " + (statusMap[status] || status) + " (ID:" + loginId + ")"); + }; + + function updatePttLoginStatusUI(status) { + if (status === "02") { + pttStatusTag.innerText = "PTT 已登录"; + pttStatusTag.className = "ws-status ws-connected"; + pttBtn.disabled = false; + pttBtn.style.background = "#ef4444"; + pttBtn.style.cursor = "pointer"; + var actionBtns = document.querySelectorAll('.ptt-action-btn'); + for (var i = 0; i < actionBtns.length; i++) { + actionBtns[i].disabled = false; + } + } else if (status === "01") { + pttStatusTag.innerText = "PTT 登录中..."; + pttStatusTag.className = "ws-status ws-disconnected"; + } else { + pttStatusTag.innerText = "PTT 未登录"; + pttStatusTag.className = "ws-status ws-disconnected"; + } + } + // 修复 PTT 按键逻辑:支持 TouchEvents 并处理异常中断 if (pttBtn) { var isDown = false; diff --git a/app/src/main/java/com/example/kingway/ptt/CallBackResolution.java b/app/src/main/java/com/example/kingway/ptt/CallBackResolution.java index 9b47004..bf76c59 100644 --- a/app/src/main/java/com/example/kingway/ptt/CallBackResolution.java +++ b/app/src/main/java/com/example/kingway/ptt/CallBackResolution.java @@ -18,6 +18,21 @@ public class CallBackResolution { private static int logNum = 0; private static long offlineTime = 0; private static boolean loginState = false; + private static String pttLoginStatus = "00"; // 00-未登录 01-登录中 02-已登录 + private static String pttLoginId = ""; + + public static String getPttLoginStatus() { + return pttLoginStatus; + } + + public static String getPttLoginId() { + return pttLoginId; + } + + public static void resetPttLoginStatus() { + pttLoginStatus = "00"; + pttLoginId = ""; + } public static void at_OEM_AT_cb(List lisHex){ if (lisHex.size() == 0) { @@ -33,14 +48,23 @@ public class CallBackResolution { switch (firstHex){ case "82"://登录状态通知指令 String loginId = lisHex.get(2) + "" + lisHex.get(3) + "" + lisHex.get(4) + "" + lisHex.get(5); + pttLoginStatus = errorNum; + pttLoginId = loginId; + Timber.tag(TAG).i("PTT login status: %s, id: %s", pttLoginStatus, pttLoginId); + // 实时推送状态到前端 + com.stand.standapp.MainActivity.executeJs("updatePttLoginStatus('" + pttLoginStatus + "','" + pttLoginId + "')"); CallBackUtil.callBackLoinState(errorNum, loginId); loginState = isLoginConflict(errorNum); CallBackUtil.callBackLoginConflict(loginState); + if (loginState) { + com.stand.standapp.MainActivity.showPttConflictDialog(); + } if ("02".equals(errorNum)) { com.stand.standapp.MainActivity.onPttLoginSuccess(); } break; + case "a2"://账号有视频功能 CallBackUtil.callBackHaveVideo(); break; diff --git a/app/src/main/java/com/example/kingway/ptt/MyApplication.java b/app/src/main/java/com/example/kingway/ptt/MyApplication.java index 6ab8928..e52fe3d 100644 --- a/app/src/main/java/com/example/kingway/ptt/MyApplication.java +++ b/app/src/main/java/com/example/kingway/ptt/MyApplication.java @@ -46,4 +46,14 @@ public class MyApplication { Log.e("PTT_INIT", "Failed to init PTT: " + e.getMessage()); } } + + public static void destroy() { + if (pNative != null) { + pNative.destory(); + pNative = null; + } + mContext = null; + mAppInstance = new MyApplication(); + CallBackResolution.resetPttLoginStatus(); + } } diff --git a/app/src/main/java/com/stand/standapp/AndroidInterface.kt b/app/src/main/java/com/stand/standapp/AndroidInterface.kt index 925e635..a97b239 100644 --- a/app/src/main/java/com/stand/standapp/AndroidInterface.kt +++ b/app/src/main/java/com/stand/standapp/AndroidInterface.kt @@ -35,9 +35,26 @@ class AndroidInterface(private val activity: MainActivity) { } /** - * PTT 停止说话 + * 获取 PTT 登录状态: "00"-未登录 "01"-登录中 "02"-已登录 */ @JavascriptInterface + fun pttGetLoginStatus(): String { + return com.example.kingway.ptt.CallBackResolution.getPttLoginStatus() + } + + /** + * 获取 PTT 登录 ID + */ + @JavascriptInterface + fun pttGetLoginId(): String { + return com.example.kingway.ptt.CallBackResolution.getPttLoginId() + } + + /** + * PTT 登录 + */ + + @JavascriptInterface fun pttSpeakRelease() { if (isSpeaking) { val now = System.currentTimeMillis() diff --git a/app/src/main/java/com/stand/standapp/LoginActivity.kt b/app/src/main/java/com/stand/standapp/LoginActivity.kt index 08ca37f..9d58955 100644 --- a/app/src/main/java/com/stand/standapp/LoginActivity.kt +++ b/app/src/main/java/com/stand/standapp/LoginActivity.kt @@ -57,6 +57,7 @@ class LoginActivity : AppCompatActivity() { // 4. 退出按钮 btnExit.setOnClickListener { + pttLogoutAndDestroy() finish() } @@ -231,8 +232,26 @@ class LoginActivity : AppCompatActivity() { AlertDialog.Builder(this) .setTitle("提示") .setMessage("确定要退出应用吗?") - .setPositiveButton("确定") { _, _ -> finish() } + .setPositiveButton("确定") { _, _ -> + pttLogoutAndDestroy() + finish() + } .setNegativeButton("取消", null) .show() } + + private fun pttLogoutAndDestroy() { + try { + com.example.kingway.ptt.SendAtUtil.toLogout() + Timber.tag("LoginActivity").i("PTT logout sent") + } catch (e: Exception) { + Timber.tag("LoginActivity").e(e, "PTT logout failed") + } + try { + com.example.kingway.ptt.MyApplication.destroy() + Timber.tag("LoginActivity").i("PTT native destroyed") + } catch (e: Exception) { + Timber.tag("LoginActivity").e(e, "PTT destroy failed") + } + } } diff --git a/app/src/main/java/com/stand/standapp/MainActivity.kt b/app/src/main/java/com/stand/standapp/MainActivity.kt index ca3dd5b..20943ed 100644 --- a/app/src/main/java/com/stand/standapp/MainActivity.kt +++ b/app/src/main/java/com/stand/standapp/MainActivity.kt @@ -69,6 +69,11 @@ class MainActivity : AppCompatActivity() { .setMessage("您的 PTT 账号已在其他设备登录,当前设备已被迫下线。\n请点击确认退出并重新登录。") .setCancelable(false) .setPositiveButton("确认") { _, _ -> + try { + com.example.kingway.ptt.SendAtUtil.toLogout() + com.example.kingway.ptt.MyApplication.destroy() + com.stand.standapp.utils.GpioManager.stopListening() + } catch (_: Exception) {} val pm = ctx.packageManager val intent = pm.getLaunchIntentForPackage(ctx.packageName) intent?.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP or Intent.FLAG_ACTIVITY_NEW_TASK) @@ -171,11 +176,34 @@ class MainActivity : AppCompatActivity() { androidx.appcompat.app.AlertDialog.Builder(this) .setTitle("提示") .setMessage("确定要退出应用吗?") - .setPositiveButton("确定") { _, _ -> finish() } + .setPositiveButton("确定") { _, _ -> + pttLogoutAndDestroy() + finish() + } .setNegativeButton("取消", null) .show() } + private fun pttLogoutAndDestroy() { + try { + com.example.kingway.ptt.SendAtUtil.toLogout() + Timber.tag("MainActivity").i("PTT logout sent") + } catch (e: Exception) { + Timber.tag("MainActivity").e(e, "PTT logout failed") + } + try { + com.stand.standapp.utils.GpioManager.stopListening() + } catch (e: Exception) { + Timber.tag("MainActivity").e(e, "GPIO stop failed") + } + try { + com.example.kingway.ptt.MyApplication.destroy() + Timber.tag("MainActivity").i("PTT native destroyed") + } catch (e: Exception) { + Timber.tag("MainActivity").e(e, "PTT destroy failed") + } + } + override fun onKeyDown(keyCode: Int, event: KeyEvent?): Boolean { if (mAgentWeb?.handleKeyEvent(keyCode, event) == true) { return true