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,
}
相关推荐
崔庆才丨静觅8 小时前
hCaptcha 验证码图像识别 API 对接教程
前端
passerby60619 小时前
完成前端时间处理的另一块版图
前端·github·web components
掘了9 小时前
「2025 年终总结」在所有失去的人中,我最怀念我自己
前端·后端·年终总结
崔庆才丨静觅9 小时前
实用免费的 Short URL 短链接 API 对接说明
前端
崔庆才丨静觅10 小时前
5分钟快速搭建 AI 平台并用它赚钱!
前端
崔庆才丨静觅10 小时前
比官方便宜一半以上!Midjourney API 申请及使用
前端
Moment10 小时前
富文本编辑器在 AI 时代为什么这么受欢迎
前端·javascript·后端
崔庆才丨静觅10 小时前
刷屏全网的“nano-banana”API接入指南!0.1元/张量产高清创意图,开发者必藏
前端
剪刀石头布啊10 小时前
jwt介绍
前端
爱敲代码的小鱼11 小时前
AJAX(异步交互的技术来实现从服务端中获取数据):
前端·javascript·ajax