Uniapp UTS插件开发实战:引入第三方SDK

创建uts 插件

  1. 创建uni_modules目录。
  1. 新建uts插件
  1. 放置第三方依赖在 libs中,如图所示

引入第三方SDK

  1. 引入格式; import 类名 from 包;

    如:import UHFRManager from "com.handheld.uhfr.UHFRManager";

  2. 使用

ts 复制代码
// app-android/index.uts
import UHFRManager from "com.handheld.uhfr.UHFRManager";

export const myApi : MyApi = function (options : MyApiOptions) {
    console.log(options.paramA)
    const instance = UHFRManager.getInstance()
    options.success?.(instance);
    options.complete?.(res);
}
ts 复制代码
// pages/test/test.vue
<template>
	<view>
    <wd-button @click="testClick"> test</wd-button>
	</view>
</template>

<script setup lang="ts">
// @ts-ignore
import {myApi} from "@/uni_modules/test-uts"

function testClick(){
  myApi({
    paramA: false,
    success:(res:any)=> {
      console.log(res);
    }
  })
}
</script>
  1. 打自定义调试基座

6. uniapp使用

插件使用示例

调试

事件管理

1、uts中

广播事件

js 复制代码
  public static registerKeyReceiver() {
    let context = UTSAndroid.getAppContext(); // 获取 Application 上下文
    let intentFilter = new IntentFilter();
    intentFilter.addAction("android.rfid.FUN_KEY");
    intentFilter.addAction("android.intent.action.FUN_KEY");
    if (this.keyReceiver == null) {
      this.keyReceiver = new KeyReceiver();
    }
    context!!.registerReceiver(this.keyReceiver, intentFilter); // 用 Application Context 进行注册
    console.log("已注册按键广播接收器3");
  }

注销广播事件

js 复制代码
  public static unregisterKeyReceiver() {
    let context = UTSAndroid.getAppContext();
    context!!.unregisterReceiver(this.keyReceiver);
    console.log("已取消注册按键广播接收器1");
  }

registerReceiver方法需要传入BroadcastReceiver类,新建一个类并重写onReceive方法

js 复制代码
class KeyReceiver extends BroadcastReceiver {
  constructor() {
    super();
  }

  override  onReceive(context : Context, intent : Intent) : void {
    let keyCode = intent.getIntExtra("keyCode", 0);
    console.log("keyCode = " + keyCode);

    if (keyCode === 0) {
      keyCode = intent.getIntExtra("keycode", 0);
    }

    let keyDown = intent.getBooleanExtra("keydown", false);

    if (keyDown) {
      // 按键按下时的处理逻辑(可自行添加)
    } else {
      // 按键松开时的处理逻辑
      switch (keyCode) {
        case KeyEvent.KEYCODE_F1:
          break;
        case KeyEvent.KEYCODE_F2:
          break;
        case KeyEvent.KEYCODE_F5:
          break;
        case KeyEvent.KEYCODE_F3: // C510x
        case KeyEvent.KEYCODE_F4: // 6100
        case KeyEvent.KEYCODE_F7: // H3100
          this.onReadTag();
          break;
      }
    }
  }
  //这里是事务处理
  private onReadTag():void{
    console.log("按键触发读取标签操作");
    try{
     rfidHelper.startScan().then(res=>{

       let intent = new Intent("com.example.RFID_SCAN");
       intent.putExtra("scannerdata", res.join(','));
       console.log("发送数据",res);
       console.log("--------------")
         let context = UTSAndroid.getAppContext();
       context!!.sendBroadcast(intent);
     });
    }catch(e){
      console.log("rfid读取失败");
    }
  }
}

2、uniapp 中

接收广播 并使用eventbus转发消息给订阅者

ts 复制代码
import { EventBus, EventKey } from './EventBus'

let main: any
let filter: any
let receiver: PlusAndroidInstanceObject
let tag: boolean = false
/**
 * 开始广播监听扫码
 * that:传this;
 */
function start() {
  /* #ifdef APP-PLUS */
  main.registerReceiver(receiver, filter)
  /* #endif */
}

/**
 * 停止广播监听扫码
 * that:传this;
 */
function stop() {
  /* #ifdef APP-PLUS */
  main.unregisterReceiver(receiver)
  /* #endif */
}

/**
 *  剩余下个变量已经做了全局变量
 *
 * 定义广播
 * that:传this;
 */
function init(onReceive?: any) {
  /* #ifdef APP-PLUS */
  // 获取activity
  main = plus.android.runtimeMainActivity()
  const IntentFilter = plus.android.importClass('android.content.IntentFilter') as any
  // console.log(IntentFilter)
  filter = new IntentFilter()
  // console.log(filter)
  // 扫描设置的广播名称
  filter.addAction('com.android.server.scannerservice.broadcast') // 测试用
  filter.addAction('com.example.RFID_SCAN')// rfid uts插件自定义
  filter.addAction('com.rfid.SCAN')// 扫码

  receiver = plus.android.implements('io.dcloud.feature.internal.reflect.BroadcastReceiver', {

    onReceive(context: any, intent: any) {
      console.log('广播接收')
      // console.log(context, intent)
      plus.android.importClass(intent)
      // 扫描设置的开发者选项--键值名称 scannerdata
      const code = intent.getStringExtra('scannerdata')

      //获取广播源
      const action = intent.getAction();
      switch(action){
        case 'com.android.server.scannerservice.broadcast':
          EventBus.emit(EventKey.TEST, code)
          break;
        case 'com.example.RFID_SCAN':
          EventBus.emit(EventKey.RFIDEvent, code)
          break;
        case 'com.rfid.SCAN':
          EventBus.emit(EventKey.ScanEvent, code)
          break;
      }

      // 业务
      // 防重复
      if (tag) {
        return
      }
      tag = true
      setTimeout(() => {
        tag = false
      }, 150)
      console.log(code)
      // 到这里扫描成功了,可以调用自己的业务逻辑,code就是扫描的结果    return出code进行业务处理
      if (onReceive) {
        onReceive(code)
      }
    },
  })
  /* #endif */
}

function test() {
  const Intent = plus.android.importClass('android.content.Intent') as any
  const intent = new Intent('com.android.server.scannerservice.broadcast')
  main = plus.android.runtimeMainActivity()
  intent.putExtra('scannerdata', '123456789')
  main.sendBroadcast(intent)
}
export const broadcastScan = {
  init,
  start,
  stop,
  test,
}
相关推荐
啦工作呢3 小时前
数据可视化 ECharts
前端·信息可视化·echarts
trsoliu3 小时前
Claude Code Templates
前端·人工智能
wangpq3 小时前
使用rerender-spa-plugin在构建时预渲染静态HTML文件优化SEO
前端·javascript·vue.js
KongHen3 小时前
完美解决请求跨域问题
前端
前端开发爱好者3 小时前
弃用 uni-app!Vue3 的原生 App 开发框架来了!
前端·javascript·vue.js
再吃一根胡萝卜3 小时前
VS Code Ctrl+/ 注释失效:两套快速修复与冲突排查方案(含可复制配置)
前端
支付宝体验科技3 小时前
Rokid 许德刚确认出席 SEE Conf 2025,带来《AI + AR 的实践与趋势》演讲
前端
PairsNightRain3 小时前
React.lazy 和 suspense 如何使用?
前端·javascript·react.js
猪哥帅过吴彦祖3 小时前
第 7 篇:交互的乐趣 - 响应用户输入
前端·webgl