上传完文件之后 点击开始升级 调用这个方法会出现以下报错 而且异常细节也捕获不到 androidStudio里面的日志打印也是一串字符 Error: java.lang.reflect.InvocationTargetException 捕获不到
19:10:38.079 点击了123 at pages/dfu/index.vue:87
19:10:38.157 [Vue warn]: Unhandled error during execution of native event handler
at <MyLabelname="设备ID: 5A:5A:59:BB:4D:59"label-width="325"width="640" ...>
at <IndexpageId=3pagePath="pages/dfu/index"__pageQuery={} ...>
19:10:38.157 Error: java.lang.reflect.InvocationTargetException
const context : Context = UTSAndroid.getAppContext()!;
export function initDfuUts(options: DfuStartOptions) {
console.log("=== DFU 调试启动 ===")
// 1. 基础验证
const firmwarePath = options.firmware?.path
console.log("[1] 固件路径:", firmwarePath)
const deviceAddress = options.device?.address
console.log("[2] 设备地址:", deviceAddress)
let starter: DfuServiceInitiator
const deviceName = options.device?.name;
try{
starter = DfuServiceInitiator(options.device.address)
.setDeviceName(deviceName)
.setKeepBond(false)
.setForceDfu(false)
.setDisableNotification(false)
.setForeground(false)
.setPacketsReceiptNotificationsEnabled(false)
.setPacketsReceiptNotificationsValue(12)
.setUnsafeExperimentalButtonlessServiceInSecureDfuEnabled(true)
starter.setZip(null, firmwarePath)
const serviceClass = UTSAndroid.getJavaClass(DfuBaseService)
starter?.start(context, serviceClass)
}catch(e){
console.log("=== DFU 调试结束 ===",e)
}
console.log("=== DFU 调试结束 ===")
}
接口文件
export type DfuStartOptions = {
device: DfuDevice
firmware: DfuFirmware
settings?: DfuSettings
success?: (res: DfuResult) => void
fail?: (res: DfuFail) => void
progress?: (progress: DfuProgress) => void
complete?: (res: DfuResult | DfuFail) => void
}
export type BleDevice = {
address: string // 设备MAC地址(唯一标识)
name?: string // 设备名称
rssi: number // 信号强度(dBm)
advertisingData?: any // 广播数据(可选,包含服务UUID等)
}
export type DfuFirmware = {
uri: string // 固件文件URI(如file://、content://)
path?: string // 固件本地路径
type?: 'ZIP' | 'HEX' | 'BIN' // 固件类型
initFilePath?: string // Init Packet路径(HEX/BIN固件必填)
}
export type DfuSettings = {
keepBond?: boolean // 保留蓝牙绑定
forceDfu?: boolean // 强制DFU模式
disableResume?: boolean // 禁用断点续传
mtuRequestEnabled?: boolean // 启用MTU请求
enableButtonlessDfu?: boolean // 启用无按钮DFU
prepareDataObjectDelay?: number // 数据包准备延迟(ms)
}
export type DfuResult = {
deviceAddress: string
upgradeTime: number // 耗时(ms)
firmwareVersion?: string
}
export interface DfuFail {
errCode: DfuErrorCode
errMsg: string
deviceAddress?: string
}
export type DfuProgress = {
percent: number // 进度百分比
speed: number // 当前传输速度(bytes/s)
avgSpeed: number // 平均速度
currentPart: number // 当前分片
partsTotal: number // 总分片
state: 'INITIALIZING' | 'UPLOADING' | 'COMPLETED'
}
export type initDfuUts = (options: DfuStartOptions) => void
AndroidManifest.xml 文件:
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools">
<!-- Android 12+ 新增的细粒度蓝牙权限 -->
<uses-permission android:name="android.permission.BLUETOOTH_SCAN"
android:usesPermissionFlags="neverForLocation"
tools:targetApi="31" />
<uses-permission android:name="android.permission.BLUETOOTH_CONNECT"
tools:targetApi="31" />
<!-- Android 6.0 到 11 所需的权限 -->
<uses-permission android:name="android.permission.BLUETOOTH"
android:maxSdkVersion="30" />
<uses-permission android:name="android.permission.BLUETOOTH_ADMIN"
android:maxSdkVersion="30" />
<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION"
android:maxSdkVersion="30" />
<uses-permission android:name="android.permission.FOREGROUND_SERVICE" />
<!-- 添加 application 标签包裹 service -->
<application>
<service
android:name="no.nordicsemi.android.dfu.DfuBaseService"
android:enabled="true"
android:exported="false" />
</application>
</manifest>
config.json:
{
"dependencies": [
"no.nordicsemi.android:dfu:2.10.1",
"androidx.core:core-ktx:1.10.1","androidx.appcompat:appcompat:1.6.1","androidx.activity:activity-ktx:1.7.2"
]
}
minSdkVersion 31 targetSdkVersion 31 Hbuilderx 4.85
1 个回复
Ask小助手 - Ask社区AI助手
您的DFU蓝牙升级反射异常问题,主要源于UTS调用Java层DFU库时的异常传递问题。根据知识库,App-Android平台存在多个UTS与Java混编相关的修复记录:
异常捕获问题:知识库中提到"App-Android平台 修复 java混编模式下,不能使用 console.log"(详情),这可能导致Java层异常无法正常传递到UTS层。建议在Java层添加日志输出。
DFU配置问题:检查
AndroidManifest.xml中DFU Service配置是否正确。需确保:参数验证:确认
firmwarePath是否为有效URI格式(应为file://开头)。DFU库要求路径必须是content URI或file URI。版本兼容性:您使用的DFU库2.10.1与targetSdkVersion 31可能存在兼容性问题。参考知识库中"Android平台 更新 云端打包环境 compileSdk 为 35"(详情),建议升级HBuilderX至最新alpha版(4.86+)以获取Android 14+兼容性修复。
异常处理增强:修改UTS代码,在调用前增加参数校验:
建议查阅DFU官方文档确认参数配置。对于深度集成问题,可考虑使用插件市场中的成熟DFU插件(如搜索"DFU")。
要回复问题请先登录或注册
公告
更多>相关问题