HBuilderX

HBuilderX

极客开发工具
uni-app

uni-app

开发一次,多端覆盖
uniCloud

uniCloud

云开发平台
HTML5+

HTML5+

增强HTML5的功能体验
MUI

MUI

上万Star的前端框架

关于华为的HSM生态系统

HMS生态已经有不少的好功能了,不知道有志同道合的朋友一起研究开发一版uni的插件系统吗?

HMS生态已经有不少的好功能了,不知道有志同道合的朋友一起研究开发一版uni的插件系统吗?

APP端 选择视频的时候没有封面或者缩略图,这里调用安卓原生生成视频缩略图代码

生成jpg 格式缩略图,以视频名称命名并保存在视频旁边,如果已经有图片,则直接范围图片路径.
Navit.js

async getAndroidVideoThumb(path)  
{  
                path=plus.io.convertLocalFileSystemURL( path);  
        var pathns=path.split(".");  
        pathns[pathns.length-1]="jpg";  
        var imgpath=pathns.join(".");  
        var File = plus.android.importClass("java.io.File");  
        var file = new File(imgpath);  
        if(file.exists())return "file://"+plus.io.convertAbsoluteFileSystem(imgpath);  
        var FileOutputStream  = plus.android.importClass("java.io.FileOutputStream");  
        var outputStream = new FileOutputStream(file);  
        var Bitmap = plus.android.importClass("android.graphics.Bitmap");  
        var thum=plus.android.invoke("android.media.ThumbnailUtils","createVideoThumbnail",path,1);  
        var result= plus.android.invoke(thum,"compress",Bitmap.CompressFormat.JPEG,100,outputStream);  
        if(!result)return null;  
        plus.android.invoke(thum,"recycle");  
        thum=null;  
        plus.android.invoke(outputStream,"flush");  
        plus.android.invoke(outputStream,"close");  
        return "file://"+plus.io.convertAbsoluteFileSystem(imgpath);  
}
继续阅读 »

生成jpg 格式缩略图,以视频名称命名并保存在视频旁边,如果已经有图片,则直接范围图片路径.
Navit.js

async getAndroidVideoThumb(path)  
{  
                path=plus.io.convertLocalFileSystemURL( path);  
        var pathns=path.split(".");  
        pathns[pathns.length-1]="jpg";  
        var imgpath=pathns.join(".");  
        var File = plus.android.importClass("java.io.File");  
        var file = new File(imgpath);  
        if(file.exists())return "file://"+plus.io.convertAbsoluteFileSystem(imgpath);  
        var FileOutputStream  = plus.android.importClass("java.io.FileOutputStream");  
        var outputStream = new FileOutputStream(file);  
        var Bitmap = plus.android.importClass("android.graphics.Bitmap");  
        var thum=plus.android.invoke("android.media.ThumbnailUtils","createVideoThumbnail",path,1);  
        var result= plus.android.invoke(thum,"compress",Bitmap.CompressFormat.JPEG,100,outputStream);  
        if(!result)return null;  
        plus.android.invoke(thum,"recycle");  
        thum=null;  
        plus.android.invoke(outputStream,"flush");  
        plus.android.invoke(outputStream,"close");  
        return "file://"+plus.io.convertAbsoluteFileSystem(imgpath);  
}
收起阅读 »

tabber底部导航切换页面

导航栏

uniapp制作微信小程序 不管是自带的tabber底部导航栏还是自定义的都会出现切换页面会一闪一闪的.

复现:安卓手机上的微信小程序,

ios不会出现 , 安卓手机app也不会出现 安卓的小程序会出现切换闪一下
这是uniapp的bug吗?

uniapp制作微信小程序 不管是自带的tabber底部导航栏还是自定义的都会出现切换页面会一闪一闪的.

复现:安卓手机上的微信小程序,

ios不会出现 , 安卓手机app也不会出现 安卓的小程序会出现切换闪一下
这是uniapp的bug吗?

HBuilder无法检测到手机,解决办法!!

adb 真机调试

参考官方说明内容:
如果其他软件能检测到手机,但是HBuilder无法检测到,将HBuilder安装目录下的tools目录(MAC下为HBuilder.app/Contents/tools目录)下的文件备份,然后将tools\1.0.31目录下的文件拷贝到tools目录下,重启HBuilder

继续阅读 »

参考官方说明内容:
如果其他软件能检测到手机,但是HBuilder无法检测到,将HBuilder安装目录下的tools目录(MAC下为HBuilder.app/Contents/tools目录)下的文件备份,然后将tools\1.0.31目录下的文件拷贝到tools目录下,重启HBuilder

收起阅读 »

安卓微信支付报错{"errMsg":"requestPayment:fail errors"}支付的坑

支付 微信支付

首先app和小程序支付的参数不一样,小程序是驼峰的,app不是

小程序的是:appId,signType,timeStamp,nonceStr,package
app的是:appid,partnerid,prepayid,noncestr,timestamp,package

var orderInfo = {
"appid":res.data.appId,
"noncestr":res.data.nonceStr,
"package":res.data.packageValue,
partnerid":res.data.partnerId,
"prepayid":res.data.prepayId,
"timestamp":res.data.timeStamp,
"sign":res.data.sign
}

uni.requestPayment({
provider: 'wxpay',
orderInfo: orderInfo, //微信 订单数据

然后就可以调起支付了,当然,你需要看看,你签名对不对
校验接口 https://pay.weixin.qq.com/wiki/doc/api/app/app.php?chapter=20_1

继续阅读 »

首先app和小程序支付的参数不一样,小程序是驼峰的,app不是

小程序的是:appId,signType,timeStamp,nonceStr,package
app的是:appid,partnerid,prepayid,noncestr,timestamp,package

var orderInfo = {
"appid":res.data.appId,
"noncestr":res.data.nonceStr,
"package":res.data.packageValue,
partnerid":res.data.partnerId,
"prepayid":res.data.prepayId,
"timestamp":res.data.timeStamp,
"sign":res.data.sign
}

uni.requestPayment({
provider: 'wxpay',
orderInfo: orderInfo, //微信 订单数据

然后就可以调起支付了,当然,你需要看看,你签名对不对
校验接口 https://pay.weixin.qq.com/wiki/doc/api/app/app.php?chapter=20_1

收起阅读 »

Error: [JS Framework] Failed to receiveTasks, instance (14) is not available.

这个超过1就得考虑使用的组件是否有定时器没有清除加速了或者出现死循环

这个超过1就得考虑使用的组件是否有定时器没有清除加速了或者出现死循环

二维码生成为空白

二维码生成不了大多都是val属性没有绑定到值所引起的,在hospital-qrcode页面有一个反例可以参考.
这个页面生成不了二维码的主要原因是路由传参的值需要在onLoad中获取,但事先需要在data()中定义这个对
象,在created时初始化了对象.生命周期顺序:created->onLoad->qrcode mounted->mouted

    ...  
    data() {  
        patientInfo: {}  
    }  
    ...
这就造成了`tki-qrcode`组件在`mounted`的时候获取的`val`是`undefined`(patientInfo.qrcode=undefined)  
,以下为`tki-qrcode`挂载源码  
```javacript  
mounted: function () {  
    if (this.loadMake) {  
        if (!this._empty(this.val)) { // -> val为undefined,就不会执行_makeCode()函数  
            setTimeout(() => {  
                this._makeCode()  
            }, 0);  
        }  
    }  
}  
```  
所以呢,需要给`tki-qrcode`新增一个属性`:onval="true"`,在`onLoad`后`patientInfo`对象有了数据  
,`val`会重新绑定值,自动生成二维码.  
                    <view class="qrcode">  
                        <tki-qrcode class="uni-popupTabbar-qrcodeimg" ref="qrcode" cid="hosCode" :val="patientInfo.qcode" :icon="qrcode"  
                         :size="200" unit="upx" :loadMake="true" :onval="true">  
                        </tki-qrcode>  
                        <!-- 反例! 二维码不会生成-->  
                        <tki-qrcode class="uni-popupTabbar-qrcodeimg" ref="qrcode" cid="hosCode" :val="patientInfo.qcode" :icon="qrcode"  
                         :size="200" unit="upx" :loadMake="true" >  
                        </tki-qrcode>  
                    </view>
继续阅读 »

二维码生成不了大多都是val属性没有绑定到值所引起的,在hospital-qrcode页面有一个反例可以参考.
这个页面生成不了二维码的主要原因是路由传参的值需要在onLoad中获取,但事先需要在data()中定义这个对
象,在created时初始化了对象.生命周期顺序:created->onLoad->qrcode mounted->mouted

    ...  
    data() {  
        patientInfo: {}  
    }  
    ...
这就造成了`tki-qrcode`组件在`mounted`的时候获取的`val`是`undefined`(patientInfo.qrcode=undefined)  
,以下为`tki-qrcode`挂载源码  
```javacript  
mounted: function () {  
    if (this.loadMake) {  
        if (!this._empty(this.val)) { // -> val为undefined,就不会执行_makeCode()函数  
            setTimeout(() => {  
                this._makeCode()  
            }, 0);  
        }  
    }  
}  
```  
所以呢,需要给`tki-qrcode`新增一个属性`:onval="true"`,在`onLoad`后`patientInfo`对象有了数据  
,`val`会重新绑定值,自动生成二维码.  
                    <view class="qrcode">  
                        <tki-qrcode class="uni-popupTabbar-qrcodeimg" ref="qrcode" cid="hosCode" :val="patientInfo.qcode" :icon="qrcode"  
                         :size="200" unit="upx" :loadMake="true" :onval="true">  
                        </tki-qrcode>  
                        <!-- 反例! 二维码不会生成-->  
                        <tki-qrcode class="uni-popupTabbar-qrcodeimg" ref="qrcode" cid="hosCode" :val="patientInfo.qcode" :icon="qrcode"  
                         :size="200" unit="upx" :loadMake="true" >  
                        </tki-qrcode>  
                    </view>
收起阅读 »

如何解决APP离线推送(前后端)

java unipush

1.技术选择:uni-app的UniPush(集成个推)、Java SpringBoot

2.前端代码:App.vue的onLaunch方法中加入

// #ifdef APP-PLUS  
    const _handlePushClick = function(message) {  
        // 自行处理消息点击事件  
        let {payload} = message;  
        console.log( message );  
    };  
    const _handlePushReceive = function(message) {  
        // 消息接收事件,手动创造本地通知信息  
        plus.push.createMessage(msg.content, message.payload, {  
            title: message.title  
        })  
    };  
    plus.push.addEventListener('click', _handlePushClick);    
    plus.push.addEventListener('receive', _handlePushReceive);    
    APPUpdate();  
// #endif

3.后端代码:

// 如果需要使用HTTPS,直接修改url即可  
//private static String url = "https://api.getui.com/apiex.htm";  
private static String url = "http://api.getui.com/apiex.htm";  
private static String appKey = "你的app key";  
private static String masterSecret = "你的app MasterSecret";  

    /**  
     * APP发送系统通知  
     * @param noticeForm 前端表单 包括title、content  
     * @return  
     */  
@PostMapping("/notice")  
public void notice(@RequestBody AppNoticeForm noticeForm) {  
        // 获取应用基本信息  
        IGtPush push = new IGtPush(url, appKey, masterSecret);  
        // 选择透传通知模板,个推离线只支持透传  
        TransmissionTemplate template = new TransmissionTemplate();  
        template.setAppId(appId);  
        template.setAppkey(appKey);  

        String payload = JSONUtil.toJsonStr(form);  
        template.setTransmissionContent(payload);    // 设置透传内容  
        template.setTransmissionType(2);    // 2代表客户端收到消息后需要自行处理  

        // 配置第三方厂商推送  
        Notify notify = new Notify();  
        notify.setTitle(form.getTitle());  
        notify.setContent(form.getContent());  
        notify.setType(GtReq.NotifyInfo.Type._intent);  
        // 设置intent 注意格式要正确(修改你的包名)  
        notify.setIntent("intent:#Intent;action=android.intent.action.oppopush;" +  
                "launchFlags=0x14000000;" +  
                "component=你的包名/io.dcloud.PandoraEntry;S.UP-OL-SU=true;" +  
                "S.title=" + form.getTitle() + ";" +  
                "S.content="+  form.getContent() + ";" +  
                "S.payload=" + payload + ";end");  
        notify.setPayload(payload);  
        template.set3rdNotifyInfo(notify);  

        List<String> appIds = new ArrayList<>();  
        appIds.add(appId);  
        AppMessage message = new AppMessage();  
        message.setData(template);  
        message.setAppIdList(appIds);  
        message.setOffline(true);  
        message.setOfflineExpireTime(8* 1000 * 3600);    // 离线有效时间 单位毫秒  
        message.setStrategyJson("{\"default\":1}");  
    // 推送给所有用户  
        IPushResult ret = push.pushMessageToApp(message);  
    }

4.在dcloud的开发者中心配置 厂商推送设置 即可完成离线推送
参考: UniPush使用指南

继续阅读 »

1.技术选择:uni-app的UniPush(集成个推)、Java SpringBoot

2.前端代码:App.vue的onLaunch方法中加入

// #ifdef APP-PLUS  
    const _handlePushClick = function(message) {  
        // 自行处理消息点击事件  
        let {payload} = message;  
        console.log( message );  
    };  
    const _handlePushReceive = function(message) {  
        // 消息接收事件,手动创造本地通知信息  
        plus.push.createMessage(msg.content, message.payload, {  
            title: message.title  
        })  
    };  
    plus.push.addEventListener('click', _handlePushClick);    
    plus.push.addEventListener('receive', _handlePushReceive);    
    APPUpdate();  
// #endif

3.后端代码:

// 如果需要使用HTTPS,直接修改url即可  
//private static String url = "https://api.getui.com/apiex.htm";  
private static String url = "http://api.getui.com/apiex.htm";  
private static String appKey = "你的app key";  
private static String masterSecret = "你的app MasterSecret";  

    /**  
     * APP发送系统通知  
     * @param noticeForm 前端表单 包括title、content  
     * @return  
     */  
@PostMapping("/notice")  
public void notice(@RequestBody AppNoticeForm noticeForm) {  
        // 获取应用基本信息  
        IGtPush push = new IGtPush(url, appKey, masterSecret);  
        // 选择透传通知模板,个推离线只支持透传  
        TransmissionTemplate template = new TransmissionTemplate();  
        template.setAppId(appId);  
        template.setAppkey(appKey);  

        String payload = JSONUtil.toJsonStr(form);  
        template.setTransmissionContent(payload);    // 设置透传内容  
        template.setTransmissionType(2);    // 2代表客户端收到消息后需要自行处理  

        // 配置第三方厂商推送  
        Notify notify = new Notify();  
        notify.setTitle(form.getTitle());  
        notify.setContent(form.getContent());  
        notify.setType(GtReq.NotifyInfo.Type._intent);  
        // 设置intent 注意格式要正确(修改你的包名)  
        notify.setIntent("intent:#Intent;action=android.intent.action.oppopush;" +  
                "launchFlags=0x14000000;" +  
                "component=你的包名/io.dcloud.PandoraEntry;S.UP-OL-SU=true;" +  
                "S.title=" + form.getTitle() + ";" +  
                "S.content="+  form.getContent() + ";" +  
                "S.payload=" + payload + ";end");  
        notify.setPayload(payload);  
        template.set3rdNotifyInfo(notify);  

        List<String> appIds = new ArrayList<>();  
        appIds.add(appId);  
        AppMessage message = new AppMessage();  
        message.setData(template);  
        message.setAppIdList(appIds);  
        message.setOffline(true);  
        message.setOfflineExpireTime(8* 1000 * 3600);    // 离线有效时间 单位毫秒  
        message.setStrategyJson("{\"default\":1}");  
    // 推送给所有用户  
        IPushResult ret = push.pushMessageToApp(message);  
    }

4.在dcloud的开发者中心配置 厂商推送设置 即可完成离线推送
参考: UniPush使用指南

收起阅读 »

uni-app集成unipush推送

unipush

本文实现推送,使用的是透传信息。
以下内容只做学习记录,等全部测试完成后,更新代码。
iOS推送流程说明:
iOS的消息是分两部分的:一部分是走APNs的通知栏消息,另一部分是走个推通道的透传消息。这两部分是服务端推送代码里面应用设定好的,分别是两个不同的方法。如果消息下发的时候,当应用是在后台的(也就是应用是离线)那么会收到APNs的通知,透传消息就进离线了;只有当APP下次在线的时候(也就是下次应用到前台的时候)才会通过个推通道下发,如果当下发的时候应用是在前台的,客户端就直接收到透传消息。
安卓推送流程说明:
在线情况下使用的是个推消息通道;离线情况,如果不集成厂商,那么透传信息进入离线,只有当app在线时,才会触发;离线情况集成厂商,会走厂商通道。
在使用的过程中,尤其应该注意payload的类型,以及苹果端对于在线、离线消息的处理

继续阅读 »

本文实现推送,使用的是透传信息。
以下内容只做学习记录,等全部测试完成后,更新代码。
iOS推送流程说明:
iOS的消息是分两部分的:一部分是走APNs的通知栏消息,另一部分是走个推通道的透传消息。这两部分是服务端推送代码里面应用设定好的,分别是两个不同的方法。如果消息下发的时候,当应用是在后台的(也就是应用是离线)那么会收到APNs的通知,透传消息就进离线了;只有当APP下次在线的时候(也就是下次应用到前台的时候)才会通过个推通道下发,如果当下发的时候应用是在前台的,客户端就直接收到透传消息。
安卓推送流程说明:
在线情况下使用的是个推消息通道;离线情况,如果不集成厂商,那么透传信息进入离线,只有当app在线时,才会触发;离线情况集成厂商,会走厂商通道。
在使用的过程中,尤其应该注意payload的类型,以及苹果端对于在线、离线消息的处理

收起阅读 »

uniapp 文字滚动栏组件

组件 自定义组件

由于项目需要,公告自动滚动展示,在网上找了下,有些是可以实现的,
例如:

https://ask.dcloud.net.cn/article/35712
但是有点小问题:公共字数过长的话,展示不全。

还有的是使用css的动画效果实现,大家都知道css动画是指定了时间的,如果公告内容过多的话,会展示


所以重新写了一个组件,也有点瑕疵,就是公告滚动完之后再滚动下前会有一段的空白,后面再优化

组件地址:
git@codehub.devcloud.huaweicloud.com:uni-appComponent00001/uni-appDemo.git

使用方法:
1、将 /components/screenTextScroll.vuecopy到自己的项目中(components目录下)
2、在main.js中添加代码

import screenTextScroll from '@/components/screenTextScroll.vue'   
Vue.component('textscroll', screenTextScroll)

3、在需要使用的视图中调用

<textscroll :list="list" />

list为滚动的文字集合

继续阅读 »

由于项目需要,公告自动滚动展示,在网上找了下,有些是可以实现的,
例如:

https://ask.dcloud.net.cn/article/35712
但是有点小问题:公共字数过长的话,展示不全。

还有的是使用css的动画效果实现,大家都知道css动画是指定了时间的,如果公告内容过多的话,会展示


所以重新写了一个组件,也有点瑕疵,就是公告滚动完之后再滚动下前会有一段的空白,后面再优化

组件地址:
git@codehub.devcloud.huaweicloud.com:uni-appComponent00001/uni-appDemo.git

使用方法:
1、将 /components/screenTextScroll.vuecopy到自己的项目中(components目录下)
2、在main.js中添加代码

import screenTextScroll from '@/components/screenTextScroll.vue'   
Vue.component('textscroll', screenTextScroll)

3、在需要使用的视图中调用

<textscroll :list="list" />

list为滚动的文字集合

收起阅读 »

支付宝JSError收集

支付宝小程序

Uncaught TypeError: Cannot set property 'value' of undefined(版本:1.1.46,文件:-,行:-,列:-,变量名:-,源代码:-)

undefined is not an object (evaluating 'this. vm. refs')(版本:1.1.46,文件:-,行:-,列:-,变量名:-,源代码:-)

this.parent.setValue is not a function. (In 'this.parent.setValue(this.name)'; 'this.parent.setValue' is undefined)(版本:1.1.46,文件:-,行:-,列:-,变量名:-,源代码:-)

e.split is not a function. (In 'e.split("_")'; 'e.split' is undefined)(版本:1.1.46,文件:-,行:-,列:-,变量名:-,源代码:-)

TypeError: n.unshift is not a function. (In 'n.unshift(e.toUpperCase())'; 'n.unshift' is undefined)(版本:1.1.46,文件:-,行:-,列:-,变量名:-,源代码:-)

TypeError: t.setNavigationBarTitle is not a function. (In 't.setNavigationBarTitle({title:e.getNavigateTitle()})'; 't.setNavigationBarTitle' is undefined)(版本:1.1.46,文件:-,行:-,列:-,变量名:-,源代码:-)

继续阅读 »

Uncaught TypeError: Cannot set property 'value' of undefined(版本:1.1.46,文件:-,行:-,列:-,变量名:-,源代码:-)

undefined is not an object (evaluating 'this. vm. refs')(版本:1.1.46,文件:-,行:-,列:-,变量名:-,源代码:-)

this.parent.setValue is not a function. (In 'this.parent.setValue(this.name)'; 'this.parent.setValue' is undefined)(版本:1.1.46,文件:-,行:-,列:-,变量名:-,源代码:-)

e.split is not a function. (In 'e.split("_")'; 'e.split' is undefined)(版本:1.1.46,文件:-,行:-,列:-,变量名:-,源代码:-)

TypeError: n.unshift is not a function. (In 'n.unshift(e.toUpperCase())'; 'n.unshift' is undefined)(版本:1.1.46,文件:-,行:-,列:-,变量名:-,源代码:-)

TypeError: t.setNavigationBarTitle is not a function. (In 't.setNavigationBarTitle({title:e.getNavigateTitle()})'; 't.setNavigationBarTitle' is undefined)(版本:1.1.46,文件:-,行:-,列:-,变量名:-,源代码:-)

收起阅读 »

抓包了几个影视接口,实现了一个简单影视加vip视频解析app!

下面分享几个效果图:


稍后我将把页面源码上传到插件市场
如有兴趣的欢迎交流:wx:ZHT131572

下面分享几个效果图:


稍后我将把页面源码上传到插件市场
如有兴趣的欢迎交流:wx:ZHT131572