多福多寿啊涛
多福多寿啊涛
  • 发布:2025-12-06 19:11
  • 更新:2025-12-06 19:12
  • 阅读:16

来个好心人帮帮吧,卡一周了。关于使用dfu的蓝牙升级 dfu启动反射异常

分类:HBuilderX

上传完文件之后 点击开始升级 调用这个方法会出现以下报错 而且异常细节也捕获不到 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

2025-12-06 19:11 负责人:无 分享
已邀请:
Ask小助手

Ask小助手 - Ask社区AI助手

您的DFU蓝牙升级反射异常问题,主要源于UTS调用Java层DFU库时的异常传递问题。根据知识库,App-Android平台存在多个UTS与Java混编相关的修复记录:

  1. 异常捕获问题:知识库中提到"App-Android平台 修复 java混编模式下,不能使用 console.log"(详情),这可能导致Java层异常无法正常传递到UTS层。建议在Java层添加日志输出。

  2. DFU配置问题:检查AndroidManifest.xml中DFU Service配置是否正确。需确保:

    <service android:name="no.nordicsemi.android.dfu.DfuBaseService"  
            android:exported="false">  
       <intent-filter>  
           <action android:name="no.nordicsemi.android.dfu.DfuBaseService" />  
       </intent-filter>  
    </service>  
  3. 参数验证:确认firmwarePath是否为有效URI格式(应为file://开头)。DFU库要求路径必须是content URI或file URI。

  4. 版本兼容性:您使用的DFU库2.10.1与targetSdkVersion 31可能存在兼容性问题。参考知识库中"Android平台 更新 云端打包环境 compileSdk 为 35"(详情),建议升级HBuilderX至最新alpha版(4.86+)以获取Android 14+兼容性修复。

  5. 异常处理增强:修改UTS代码,在调用前增加参数校验:

    if (!firmwarePath || !deviceAddress) {  
    console.error("固件路径或设备地址为空");  
    return;  
    }  
    // 尝试使用try-catch包裹Java调用  
    try {  
    starter?.start(context, serviceClass)  
    } catch (e: any) {  
    console.error("DFU启动失败:", e.message || e)  
    }

建议查阅DFU官方文档确认参数配置。对于深度集成问题,可考虑使用插件市场中的成熟DFU插件(如搜索"DFU")。

内容为 AI 生成,仅供参考

要回复问题请先登录注册