最近开始踩坑UNI-App,说一些碰到的坑
说起uniapp,作为前端的我听说和就是用vue做应用,突发好奇心,在这个新的安卓项目里过段推开了安卓的小哥(后悔),打算大显身手,不过使用中还是发现了一些诡异的问题。在此记录下供自己也供后人分享。
首先这次项目做的是手持终端的东西,终端用的是NF5501的共版,订购时厂家写好了底层,用的原生安卓6.0的系统。
摄像头扫码功能
二话不说先上代码:
//摄像机扫码赋值
getSancode:function(){
var that = this;
uni.scanCode({
success: function(res) {
var result = res.result
uni.showModal({
title: '提示',
content: '是否确认工单无误,即将派工给:'+result,
success: function (res) {
if (res.confirm) {
console.log('用户点击确定');
that.postuser = reres;
} else if (res.cancel) {
console.log('用户点击取消');
}
}
});
}
});
},
很简单,可喜可乐~~~开心的我像个傻子。
红外线扫码
这就是个坑了,因为红外线扫码是设备的特殊功能,uni底层并没有能提供可以直接调用的方法,不过厂家也是好样的,随着摁下音量键,直接触发扫码,然后以系统广播的形式发送了扫码结果。enmmm,这里挂载,也就是激活init红外扫码硬件的工作是安卓小哥在项目打包时用Studio打进去的。
uni部分代码:
//开启服务监听
initScan() {
var that = this;
console.log('开启了监听');
let _this = this;
main = plus.android.runtimeMainActivity();//获取activity
var IntentFilter = plus.android.importClass('android.content.IntentFilter');
filter = new IntentFilter();
filter.addAction("com.qs.scancode"); // 换你的广播动作
receiver = plus.android.implements('io.dcloud.feature.internal.reflect.BroadcastReceiver',{
onReceive : function(context, intent) {
plus.android.importClass(intent);
let code = intent.getStringExtra("code");// 换你的广播标签
_this.queryCode(code);
that.postuser = globe.repoint(JSON.stringify(code))
}});
},
//这个得有,开启监听用
startScan(){
main.registerReceiver(receiver,filter);
},
//这个也得有,关闭监听用
stopScan(){
main.unregisterReceiver(receiver);
},
//这个是防止重复用的
queryCode: function(code){
//防重复
if(_codeQueryTag)return false;
_codeQueryTag = true;
setTimeout(function(){
_codeQueryTag = false;
},150);
var id = code
console.log('id:', id)
uni.$emit('scancodedate',{code:id})
},
简单来说在初始的时候就要调用以下
created: function (option) {
this.initScan();
this.startScan();
},
onShow(){
this.initScan();
this.startScan();
},
结束时调用以下
onHide:function(){
this.stopScan();
},
destroyed:function(){
/*页面退出时一定要卸载监听,否则下次进来时会重复,造成扫一次出2个以上的结果*/
this.stopScan();
},
至此红外扫码也告一段落了,接下来还有更坑的。
调用内置打印机(uni调用原生提供的插件)
这个项目中还有打印小票这个工序,-。-坑爹啊,这个东西啥也没咋调用,这个时候发现了牛逼Plus的大佬写的东西,因为一些原因我没办法提供安卓部分代码,不过我已经将名字改为了textdemo,安卓部分代码大家上uni官网直接Ctrl+C他的就行。
var testModule = uni.requireNativePlugin('TestModule');
testModule.testAsyncFunc({
align:'1',
width:'300',
height:'300',
string:that.postuser,
print:'派工人:'+that.postuser
}, result => {
console.log(result.type)
});
对不起对不起,我知道这样有点糊弄,但是安卓代码真是拿不出了。。。
以上就是这个项目的3个主要模块了。扫码,打印。