上次实现pda扫码功能,是通过输入框焦点,获取扫码的内容。但有一个致命问题就是,获取输入框焦点默认会弹出键盘,占据了半屏幕。

试了很多方法,都没法去掉键盘的弹出:

1.

2. disabled阻止聚焦:focus="true"小程序/App 端不会生效;

3.使用<input-no-keybord>组件,是在键盘弹出后再隐藏键盘,也不行。

后续发现,pda也属于安卓设备,直接注册扫码动作的广播就可以了

1.查看设备广播码

2.代码

initScan() {
				let _this = this;
				this.main = plus.android.runtimeMainActivity();
				var IntentFilter = plus.android.importClass(
					"android.content.IntentFilter"
				);
				// 意图过滤器
				this.filter = new IntentFilter();
				this.filter.addAction("android.intent.ACTION_SCAN_OUTPUT");
				// 接收器
				this.receiver = plus.android.implements(
					"io.dcloud.feature.internal.reflect.BroadcastReceiver",
					{
						onReceive: function (context, intent) {
							plus.android.importClass(intent);
							let code = intent.getStringExtra("barcode");
							console.log("xx11", code);
							_this.changeCode(code);
						},
					}
				);
			},
			startScan() {
				try {
					// 注册广播接收器
					this.main.registerReceiver(this.receiver, this.filter);
				} catch (error) {
					console.log("error", error);
				}
			},
			stopScan() {
				//取消注册 注销
				this.main.unregisterReceiver(this.receiver);
			},

首先,initScan()的作用是创建意图过滤器filter和接收器receiver;

  • filter(IntentFilter):声明“我要接收哪种广播”------买了哪些快递

  • receiver(BroadcastReceiver):声明“收到广播后谁来处理”------收件人

然后,startScan()的作用是注册广播接收器。stopScan()的作用是取消注册。

注册广播接收器this.main.registerReceiver(this.receiver, this.filter);是通过registerReceiver将this.receiver,和this.filter组合起来。也就是将收件人和她买的快递匹配起来。

代码详解

获取Android应用的主活动(MainActivity)对象

this.main = plus.android.runtimeMainActivity();

  • plus.android 是uni-app提供的Android原生API接口
  • runtimeMainActivity() 返回当前运行的主活动实例

导入Android的IntentFilter类

var IntentFilter = plus.android.importClass(

    "android.content.IntentFilter"

);

  • IntentFilter用于定义广播接收器要接收的广播类型
  • 这是Android系统级的类,用于处理应用间通信

创建意图过滤器

this.filter = new IntentFilter();  //创建新的IntentFilter实例
this.filter.addAction("android.intent.ACTION_SCAN_OUTPUT");   //添加要监听的广播动作

  • "android.intent.ACTION_SCAN_OUTPUT" 是扫码设备发送的广播动作名称

创建广播接收器对象

this.receiver = plus.android.implements(
    "io.dcloud.feature.internal.reflect.BroadcastReceiver",
    {
        onReceive: function (context, intent) {
            plus.android.importClass(intent);  //导入intent类,用于操作广播数据
            let code = intent.getStringExtra("barcode"); //从广播中获取扫码结果,键名为"barcode"
            console.log("xx11", code);  
            _this.changeCode(code);  //调用Vue组件的changeCode方法处理扫码结果
        },
    }
);

  • plus.android.implements 实现Android的BroadcastReceiver接口
  • onReceive 是接收广播时的回调函数

创建多个IntentFilter对象和receiver接收器,通过registerReceiver组合

 一对多:一个 receiver + 一个 filter(多 Action)

多对多:多个 receiver × 多个 filter(任意组合)

生命周期

  data() {
    return {
      receiver: null,
      filter: null,
      main: null
    };
  },

  onShow() {               // 每次页面可见(第一次、返回、后台切回)
    this.initScan();       // 里面做“已存在就 return”
    this.startScan();
  },

  onHide() {               // 页面不可见(跳路由、按 Home、开弹窗)
    this.stopScan();
  },

  onUnload() {             // 页面被销毁(返回上一页、关闭当前页面)
    this.stopScan();
  },

更详细的Android广播学习Android广播(接收,发送,标准,有序,全局,本地,实战,填坑)_android 广播-CSDN博客

Logo

有“AI”的1024 = 2048,欢迎大家加入2048 AI社区

更多推荐