fix: 代码遗漏修复(NFC回调安全+绑定电量+信号初始值)

1. NFC 打卡回调加 isAdded/view 安全检查,防止 Fragment 销毁后崩溃
2. postDelayed 回调同样加保护
3. 绑定二维码电量从写死100改为读取实时电量
4. 信号强度启动时主动读一次初始值(和蓝牙同样处理)

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
This commit is contained in:
dongliang
2026-05-07 15:10:06 +09:30
parent abd5ebd20c
commit 78d1977b98
3 changed files with 28 additions and 3 deletions

View File

@@ -60,13 +60,23 @@ class BindFragment : BaseFragment<FragmentBindBinding>() {
* 编码设备信息 JSON{bluetoothName, imei, serial, power}
* 与旧版 codeScanPair.vue 格式一致
*/
/** 获取当前电量百分比 */
private fun getCurrentBatteryLevel(): Int {
val intent = requireContext().registerReceiver(
null, android.content.IntentFilter(android.content.Intent.ACTION_BATTERY_CHANGED)
) ?: return 100
val level = intent.getIntExtra(android.os.BatteryManager.EXTRA_LEVEL, 0)
val scale = intent.getIntExtra(android.os.BatteryManager.EXTRA_SCALE, 100)
return (level * 100) / scale
}
private fun generateQrCode() {
try {
val qrData = gson.toJson(mapOf(
"bluetoothName" to devicePrefs.bluetoothName,
"imei" to devicePrefs.imei,
"serial" to devicePrefs.serial,
"power" to 100 // TODO: 接入实时电量
"power" to getCurrentBatteryLevel()
))
Timber.d("绑定: QR 数据=$qrData")

View File

@@ -328,6 +328,17 @@ class HomeFragment : BaseFragment<FragmentHomeBinding>() {
val btAdapter = android.bluetooth.BluetoothAdapter.getDefaultAdapter()
val btOn = btAdapter?.isEnabled ?: false
statusBar.updateBluetooth(btOn)
// 信号强度初始值PhoneStateListener 注册后才有回调,先读一次当前值)
try {
val telephony = requireContext().getSystemService(android.content.Context.TELEPHONY_SERVICE)
as? android.telephony.TelephonyManager
val signalLevel = telephony?.signalStrength?.level ?: 0
statusBar.updateSignal(signalLevel)
} catch (e: Exception) {
// signalStrength 可能为 nullAPI 28+),静默处理
statusBar.updateSignal(0)
}
}
/** 初始化主页数据 */

View File

@@ -820,7 +820,9 @@ class TaskListFragment : BaseFragment<FragmentTaskListBinding>() {
btn.setBackgroundResource(R.drawable.bg_foot_btn_grey)
nfcTaskManager.startTaskPunch(taskId) { success, message ->
// 恢复按钮可点击状态
// NFC 回调可能在 Fragment 销毁后触发,需要安全检查
if (!isAdded || view == null) return@startTaskPunch
btn.isEnabled = true
if (success) {
tipDialog.show(
@@ -828,7 +830,9 @@ class TaskListFragment : BaseFragment<FragmentTaskListBinding>() {
title = "打卡成功"
)
// 2 秒后(弹窗消失后)刷新任务详情
btn.postDelayed({ fetchCurrentDetail() }, 2100)
btn.postDelayed({
if (isAdded && view != null) fetchCurrentDetail()
}, 2100)
} else {
if (message != "超时") {
tipDialog.show(