HBuilderX

HBuilderX

极客开发工具
uni-app

uni-app

开发一次,多端覆盖
uniCloud

uniCloud

云开发平台
HTML5+

HTML5+

增强HTML5的功能体验
MUI

MUI

上万Star的前端框架

只勾选arm32,上架应用宝提示apk无法运行

不更改任何代码,再勾选x86打包,审核通过。
可能有些审核的人用x86的模拟器吧。
影响不大,就是包大了一点。

不更改任何代码,再勾选x86打包,审核通过。
可能有些审核的人用x86的模拟器吧。
影响不大,就是包大了一点。

HBuilderX调试安卓模拟器Genymotion

Debug Android genymotion HBuilderX

HBuilderX和Genymotion都不做介绍了
HBuilderX 版本号 3.0.7.2021123 安装路径:D:\HBuilderX
Genymotion 版本号 3.0.2 安装路径:D:\Program Files (x86)\Genymobile\Genymotion\

1.设置Genymotion adb


端口可不设
2.启动模拟器
在CMD中分别执行
d:
cd D:\Program Files (x86)\Genymobile\Genymotion\tools
.\adb devices
结果显示
List of devices attached
192.168.43.101:5555 offline
3.在Genymotion中执行
cd D:\HBuilderX\plugins\launcher\tools\adbs
.\adb connect 192.168.43.101:5555
4.我写了一个bat文件,双击运行就可以联机测试了
@echo off
echo string...
d:
cd D:\Program Files (x86)\Genymobile\Genymotion\tools\
for /f "delims=" %%i in ('.\adb devices^|find /i ":"') do set str2=%%i
cd D:\HBuilderX\plugins\launcher\tools\adbs
.\adb connect %str2

没有测试多个模拟器

继续阅读 »

HBuilderX和Genymotion都不做介绍了
HBuilderX 版本号 3.0.7.2021123 安装路径:D:\HBuilderX
Genymotion 版本号 3.0.2 安装路径:D:\Program Files (x86)\Genymobile\Genymotion\

1.设置Genymotion adb


端口可不设
2.启动模拟器
在CMD中分别执行
d:
cd D:\Program Files (x86)\Genymobile\Genymotion\tools
.\adb devices
结果显示
List of devices attached
192.168.43.101:5555 offline
3.在Genymotion中执行
cd D:\HBuilderX\plugins\launcher\tools\adbs
.\adb connect 192.168.43.101:5555
4.我写了一个bat文件,双击运行就可以联机测试了
@echo off
echo string...
d:
cd D:\Program Files (x86)\Genymobile\Genymotion\tools\
for /f "delims=" %%i in ('.\adb devices^|find /i ":"') do set str2=%%i
cd D:\HBuilderX\plugins\launcher\tools\adbs
.\adb connect %str2

没有测试多个模拟器

收起阅读 »

nvue 样式编译模式介绍

uni_app

HBuilderX 3.1.0+ 开始支持新的样式编译模式

  • weex 编译模式:老模式,样式支持与普通 weex 相同
  • uni-app 编译模式:新模式,在 weex 原有样式基础上支持组合选择器(相邻兄弟选择器、普通兄弟选择器、子选择器、后代选择器),目前已知问题:list 组件内嵌套的组件动态更新 class 无效,将在 3.1.2 修复

3.1.0 alpha 版为 uni-app 模式,3.1.1 开始缺省值为 weex 模式,切换编译模式需要重新运行

配置方式

// manifest.json  
{        
    // ...        
     /* App平台特有配置 */        
    "app-plus":  {  
        "nvueStyleCompiler": "uni-app"  
    }  
}
继续阅读 »

HBuilderX 3.1.0+ 开始支持新的样式编译模式

  • weex 编译模式:老模式,样式支持与普通 weex 相同
  • uni-app 编译模式:新模式,在 weex 原有样式基础上支持组合选择器(相邻兄弟选择器、普通兄弟选择器、子选择器、后代选择器),目前已知问题:list 组件内嵌套的组件动态更新 class 无效,将在 3.1.2 修复

3.1.0 alpha 版为 uni-app 模式,3.1.1 开始缺省值为 weex 模式,切换编译模式需要重新运行

配置方式

// manifest.json  
{        
    // ...        
     /* App平台特有配置 */        
    "app-plus":  {  
        "nvueStyleCompiler": "uni-app"  
    }  
}
收起阅读 »

随机间隔时间持续执行暂停视频播放的方法,欢迎交流

<script>  
export default {  
data() {  
    videoContext:null  
}  
onReady(){  
    this.videoContext = uni.createVideoContext('myVideo');   
    setInterval(this.pauseVideo, this.getRandomInt(1,10)*60*1000);  //按最小1分钟,最大10分钟执行pauseVideo函数  
}  
methods: {  
   pauseVideo(){  
            this.videoContext.pause();   
        },  

            /*随机时间  
        *得到一个两数之间的随机整数  
        */  
        getRandomInt(min, max) {  
          min = Math.ceil(min);  
          max = Math.floor(max);  
          return Math.floor(Math.random() * (max - min)) + min; //不含最大值,含最小值  
        },  
}  
}  
</script>
继续阅读 »
<script>  
export default {  
data() {  
    videoContext:null  
}  
onReady(){  
    this.videoContext = uni.createVideoContext('myVideo');   
    setInterval(this.pauseVideo, this.getRandomInt(1,10)*60*1000);  //按最小1分钟,最大10分钟执行pauseVideo函数  
}  
methods: {  
   pauseVideo(){  
            this.videoContext.pause();   
        },  

            /*随机时间  
        *得到一个两数之间的随机整数  
        */  
        getRandomInt(min, max) {  
          min = Math.ceil(min);  
          max = Math.floor(max);  
          return Math.floor(Math.random() * (max - min)) + min; //不含最大值,含最小值  
        },  
}  
}  
</script>
收起阅读 »

生成二维码报错gen is not defined,解决方法下面这个博客

https://blog.csdn.net/CQWNB/article/details/113576424

https://blog.csdn.net/CQWNB/article/details/113576424

uniapp前端图片和视频直传华为云OBS记录

uniapp

uniapp 官方合作的云存储是阿里云和腾讯云,但我们公司选的云存储服务恰好都不是这两家,是华为云 OBS。网上搜了多次,没有能成功的案例分享。但是,考虑到网上关于华为云性能优异的测评报告,以及我对华为这家公司的好感,我还是想努力把这条路走通。因此,走上了坚苦的踩坑之路。

但大家不必重复这个踩坑经历了,我直接上拿走即用的代码。

技术路线确定:

  1. 前端产生签名前端直传华为云OBS:好处是不经过自家服务器周转,减少一个环节,上传速度更快。坏处:前端产生签名的过程中,会将 AK,SK 等核心账号信息暴露,是极其危险的。
  2. 后端签名前端获取后直传华为云OBS:好处同上,而且由于是后端生成签名,前端获取有时效性的签名后直传云端,因此没有泄露核心账号信息的风险。

我选择第二条路线。以下是上传视频文件的步骤(图片上传相似,多文件在上传前增加一个循环而已。下面不只是前端代码,也包括必要的后端代码):

1.后端生成上传文件到OBS 的签名(PHP)的代码:
在做这一步之前,让后台技术同事先在服务器目录下安装 OBS的 PHP SKD,这一步有详细文档,此处忽略。


        $object = $this->input->post('file_name')?:''; //文件名  
        $file_type = $this->input->post('file_type')?: ''; //文件类型  
        $obsClient = new ObsClient ( [   
              'key' => '***',           //OBS 中的 AK  
              'secret' => '***',      //OBS 中的 SK  
              'endpoint' => 'https://obs.cn-north-4.myhuaweicloud.com', //注意实际的终点可能不同  
              'signature' => 'obs',  
        ] );  

        // URL有效期,3600秒  
        $expires = 3600;  

        // 上传对象  
          $resp = $obsClient->createPostSignature( [   
              'Bucket' => '***',    //你自己的桶名(bucket)  
              'Key' => $object,  
              'Expires' => $expires,  
              'FormParams' => [  
                     'x-obs-acl' => 'public-read',  
                     'content-type' => $file_type,  
              ]  
        ] );  
        // printf($resp);  
        $data['Accesskeyid'] = '***';  //AK  
        $data['Policy'] = $resp['Policy'];  
        $data['Signature'] = $resp['Signature'];  
        echo json_encode($data);  

    } ```  

2. 前端选择视频文件,生成必要信息:
```select_video(){  
                var _this = this;  
                uni.chooseVideo({  
                    maxDuration: 60,  //拍摄视频最长拍摄时间,单位秒  
                    count:1, //上传视频的数量  
                    sourceType:['camera','album'],  
                    success: (res) => {  
                        console.log(res)  
                        _this.video_src = res.tempFilePath;  
                        let index1 = res.tempFilePath.lastIndexOf('/');    
                        let index2 = res.tempFilePath.lastIndexOf('.');  
                        _this.file_name = res.tempFilePath.substring(index1+1,res.tempFilePath.length);   //获取文件名  
                        _this.file_type = res.tempFilePath.substring(index2+1, res.tempFilePath.length); // 获取文件后缀名,即文件类型  
                        _this.key = 'video/' + _this.file_name;  
                        console.log(_this.file_name)  
                        _this.is_video = 1;  
                    },  
                })  
            }, ```  

3. 前端获取上传文件的签名并直传 OBS(一步完成):  
可以写在当前页面,也可以封装成公共方法,建议封装。  

 ``` function get_obs_signature(file_path, file_name, file_type){  
    console.log(file_name)  
    return new Promise((resolve, reject)=>{  
        uni.request({  
            url: '***',    //PHP获取签名的接口路径  
            method: 'POST',  
            header:{  
                'Content-Type': 'application/x-www-form-urlencoded'  
            },  
            data: {  
                file_name: file_name,  
                file_type: file_type  
            },  
            success: (res) => {  
                console.log(res.data)  
                resolve(res.data)  
            }  
        })  
    }).then(res=>{  
        let policy = res.Policy;  
        let signature = res.Signature;  
        let ak = res.Accesskeyid;  
        console.log(policy)  
        uni.uploadFile({  
            url: 'https://***.obs.cn-north-4.myhuaweicloud.com',  //用你自己的 bucket 名替换星号  
            filePath: file_path,  
            name: 'file',  
            formData: {  
              'key': file_name,  
              'AccessKeyId': ak,  
              'Policy': policy,  
              'x-obs-acl': 'public-read',  
              'content-type': file_type,  
              'Signature': signature  
            },  
            success:(res)=>{  
                console.log(res);  
            }  
        })  
    }) ```   

4. 获取上传后的文件路径:  
OBS 默认不返回上传成功的路径,那该怎么办?其实很简单,存储在 OBS 的文件都有规律,通过以下方法可以拼接:  
obs_url = 'https://***.obs.cn-north-4.myhuaweicloud.com/' + _this.key;  //用你自己的 bucket 名替换星号  
继续阅读 »

uniapp 官方合作的云存储是阿里云和腾讯云,但我们公司选的云存储服务恰好都不是这两家,是华为云 OBS。网上搜了多次,没有能成功的案例分享。但是,考虑到网上关于华为云性能优异的测评报告,以及我对华为这家公司的好感,我还是想努力把这条路走通。因此,走上了坚苦的踩坑之路。

但大家不必重复这个踩坑经历了,我直接上拿走即用的代码。

技术路线确定:

  1. 前端产生签名前端直传华为云OBS:好处是不经过自家服务器周转,减少一个环节,上传速度更快。坏处:前端产生签名的过程中,会将 AK,SK 等核心账号信息暴露,是极其危险的。
  2. 后端签名前端获取后直传华为云OBS:好处同上,而且由于是后端生成签名,前端获取有时效性的签名后直传云端,因此没有泄露核心账号信息的风险。

我选择第二条路线。以下是上传视频文件的步骤(图片上传相似,多文件在上传前增加一个循环而已。下面不只是前端代码,也包括必要的后端代码):

1.后端生成上传文件到OBS 的签名(PHP)的代码:
在做这一步之前,让后台技术同事先在服务器目录下安装 OBS的 PHP SKD,这一步有详细文档,此处忽略。


        $object = $this->input->post('file_name')?:''; //文件名  
        $file_type = $this->input->post('file_type')?: ''; //文件类型  
        $obsClient = new ObsClient ( [   
              'key' => '***',           //OBS 中的 AK  
              'secret' => '***',      //OBS 中的 SK  
              'endpoint' => 'https://obs.cn-north-4.myhuaweicloud.com', //注意实际的终点可能不同  
              'signature' => 'obs',  
        ] );  

        // URL有效期,3600秒  
        $expires = 3600;  

        // 上传对象  
          $resp = $obsClient->createPostSignature( [   
              'Bucket' => '***',    //你自己的桶名(bucket)  
              'Key' => $object,  
              'Expires' => $expires,  
              'FormParams' => [  
                     'x-obs-acl' => 'public-read',  
                     'content-type' => $file_type,  
              ]  
        ] );  
        // printf($resp);  
        $data['Accesskeyid'] = '***';  //AK  
        $data['Policy'] = $resp['Policy'];  
        $data['Signature'] = $resp['Signature'];  
        echo json_encode($data);  

    } ```  

2. 前端选择视频文件,生成必要信息:
```select_video(){  
                var _this = this;  
                uni.chooseVideo({  
                    maxDuration: 60,  //拍摄视频最长拍摄时间,单位秒  
                    count:1, //上传视频的数量  
                    sourceType:['camera','album'],  
                    success: (res) => {  
                        console.log(res)  
                        _this.video_src = res.tempFilePath;  
                        let index1 = res.tempFilePath.lastIndexOf('/');    
                        let index2 = res.tempFilePath.lastIndexOf('.');  
                        _this.file_name = res.tempFilePath.substring(index1+1,res.tempFilePath.length);   //获取文件名  
                        _this.file_type = res.tempFilePath.substring(index2+1, res.tempFilePath.length); // 获取文件后缀名,即文件类型  
                        _this.key = 'video/' + _this.file_name;  
                        console.log(_this.file_name)  
                        _this.is_video = 1;  
                    },  
                })  
            }, ```  

3. 前端获取上传文件的签名并直传 OBS(一步完成):  
可以写在当前页面,也可以封装成公共方法,建议封装。  

 ``` function get_obs_signature(file_path, file_name, file_type){  
    console.log(file_name)  
    return new Promise((resolve, reject)=>{  
        uni.request({  
            url: '***',    //PHP获取签名的接口路径  
            method: 'POST',  
            header:{  
                'Content-Type': 'application/x-www-form-urlencoded'  
            },  
            data: {  
                file_name: file_name,  
                file_type: file_type  
            },  
            success: (res) => {  
                console.log(res.data)  
                resolve(res.data)  
            }  
        })  
    }).then(res=>{  
        let policy = res.Policy;  
        let signature = res.Signature;  
        let ak = res.Accesskeyid;  
        console.log(policy)  
        uni.uploadFile({  
            url: 'https://***.obs.cn-north-4.myhuaweicloud.com',  //用你自己的 bucket 名替换星号  
            filePath: file_path,  
            name: 'file',  
            formData: {  
              'key': file_name,  
              'AccessKeyId': ak,  
              'Policy': policy,  
              'x-obs-acl': 'public-read',  
              'content-type': file_type,  
              'Signature': signature  
            },  
            success:(res)=>{  
                console.log(res);  
            }  
        })  
    }) ```   

4. 获取上传后的文件路径:  
OBS 默认不返回上传成功的路径,那该怎么办?其实很简单,存储在 OBS 的文件都有规律,通过以下方法可以拼接:  
obs_url = 'https://***.obs.cn-north-4.myhuaweicloud.com/' + _this.key;  //用你自己的 bucket 名替换星号  
收起阅读 »

直播类小程序,没有相关证书如何过类目,如何快速上架

本人可以帮助没有直播资质的客户快速的进行微信小程序的上架,包过类目,包过审核,包上架

本人可以帮助没有直播资质的客户快速的进行微信小程序的上架,包过类目,包过审核,包上架

cover-view里的文本不能换行-vue

Vue uniapp HBuilder

cover-view里的文本不能换行可能是样式问题,在这个范围内再去找问题,一般 white-space: normal;可以解决问题,防止万一加一个!important,在cover-view就可以,但是存在换行成功,却没有文字显示,同时高度有变化却没有设置高度,这时再加上 line-height:normal!important;,让其显示出来,
原因如下:
cover-view默认属性有(好像是小程序的):
cover-view {
display:block;
line-height:1.2;
overflow:hidden;
white-space:nowrap;
pointer-events:auto;
}

注意:可以换行后,每个cover-view建议加一个高度或是单行white-space属性不为normal,如果单行没有高度或是单行white-space属性为normal,在安卓中可能不显示。

参考:https://www.jianshu.com/p/3c255f5c94f9?from=singlemessage

继续阅读 »

cover-view里的文本不能换行可能是样式问题,在这个范围内再去找问题,一般 white-space: normal;可以解决问题,防止万一加一个!important,在cover-view就可以,但是存在换行成功,却没有文字显示,同时高度有变化却没有设置高度,这时再加上 line-height:normal!important;,让其显示出来,
原因如下:
cover-view默认属性有(好像是小程序的):
cover-view {
display:block;
line-height:1.2;
overflow:hidden;
white-space:nowrap;
pointer-events:auto;
}

注意:可以换行后,每个cover-view建议加一个高度或是单行white-space属性不为normal,如果单行没有高度或是单行white-space属性为normal,在安卓中可能不显示。

参考:https://www.jianshu.com/p/3c255f5c94f9?from=singlemessage

收起阅读 »

uni-app打包h5 报内存不够

FATAL ERROR: Scavenger: semi-space copy
[HBuilder] 09:58:42.799 Allocation failed - process out of memory
[HBuilder] 09:58:42.814 1: 00B4238E

参考方案

继续阅读 »

FATAL ERROR: Scavenger: semi-space copy
[HBuilder] 09:58:42.799 Allocation failed - process out of memory
[HBuilder] 09:58:42.814 1: 00B4238E

参考方案

收起阅读 »

mui 只许上拉加载

mui

工作中用mui时出现一个问题,需求是只要上拉加载,但出现了下拉也加载的情况,现在有一个解决办法,如下:
添加 down : {
style:'circle',//必选,下拉刷新样式,目前支持原生5+ ‘circle’ 样式
color:'#2BD009', //可选,默认“#2BD009” 下拉刷新控件颜色
height:'50px',//可选,默认50px.下拉刷新控件的高度,
range:'100px', //可选 默认100px,控件可下拉拖拽的范围
offset:'0px', //可选 默认0px,下拉刷新控件的起始位置
auto: false,//可选,默认false.首次加载自动上拉刷新一次
callback :()=>{
this.disablePulldownToRefresh()
} //必选,刷新函数,根据具体业务来编写,比如通过ajax从服务器获取新数据;
}

继续阅读 »

工作中用mui时出现一个问题,需求是只要上拉加载,但出现了下拉也加载的情况,现在有一个解决办法,如下:
添加 down : {
style:'circle',//必选,下拉刷新样式,目前支持原生5+ ‘circle’ 样式
color:'#2BD009', //可选,默认“#2BD009” 下拉刷新控件颜色
height:'50px',//可选,默认50px.下拉刷新控件的高度,
range:'100px', //可选 默认100px,控件可下拉拖拽的范围
offset:'0px', //可选 默认0px,下拉刷新控件的起始位置
auto: false,//可选,默认false.首次加载自动上拉刷新一次
callback :()=>{
this.disablePulldownToRefresh()
} //必选,刷新函数,根据具体业务来编写,比如通过ajax从服务器获取新数据;
}

收起阅读 »

5+APP安卓原生插件开发全流程个人总结

5 插件 插件开发 5+App开发 5+sdk

1、离线打包

Hbuilder官方路径:https://nativesupport.dcloud.net.cn/AppDocs/usesdk/android

为什么要用离线打包呢,因为是开发安卓第三方插件,主要用的是Android Stuido,所以把5+APP项目导到Android studio里来,方便开发和测试。

其实还有一个原因,涉及到的第三方插件用到了系统级权限,要用platform.pk8来签名打包,才能运行。所以用离线打包会方便点。

Hbuilder(X)用不了pk8签名,当然,你可以把pk8转换成keystore文件,这样就可以签名了。

这里有大佬介绍转换,不过我还没试。(https://blog.csdn.net/langlitaojin/article/details/108045709)

2、添加第三方插件文件及支持
将第三方插件的jar包,so文件拷贝到Android studio相应的目录(app-libs)下,然后在gradle最外层配置:
repositories {
flatDir {
dirs 'libs'
}
}
在dependencies层加入:

implementation fileTree(dir: 'libs', include: ['.aar', '.jar', '*.so'], exclude: [])
注意:有so文件的话,需要在gradle的android层配置ndk支持。

ndk {
// 设置支持的SO库架构
abiFilters 'armeabi' ,'x86', 'armeabi-v7a'
}

3、创建java类封装第三方插件所要用到的功能,封装成一个个独立的方法。数据传递到js端:广播,或者用接口类回调。

这个有个地方要注意,如果注册了广播监听者,没有注销的话,应用退出再重新打开之后,会报:

IllegalArgumentException: Receiver not registered。

我用5+的方法去注销在java里注册的广播,但是没起到效果,不得其解。

然后我转而在java层封装了一个注销监听器的方法,然后在js层调用,问题就没再出现了。

所以呢,我觉得原生的方法就尽量在java层里写好,由js层调用,避免用5+来写。

这里呢,我觉得还是少用广播吧,注销是个麻烦事,在java里可以在专门的生命周期里注销,但是在js里,就麻烦了,要在各种事件(页面上的返回键或关闭键,手机上的虚拟或物理返回)上去监听做注销处理。

4、创建一个js类,用5+API来封装上面封装好的java类的方法。

用java封装完第三方库,接着就是在js也封装一个相应的api,方便前端开发人员使用,也方便维护。


注意:如果是系统级应用,那么要hook一下webview(因为webview存在安全漏洞,从安卓5.1开始,谷歌禁止系统应用使用webview)。

提示:Caused by: java.lang.UnsupportedOperationException: For security reasons, WebView is not allowed in privileged processes

解决方法:

1、首先呢,创建一个Application继承自DCloudApplication,然后在AndroidManifest.xml里,引用自己的Application,且加上tools:replace="android:name",避免与Hbuilder的lib里的DCloudApplication冲突

2、在application的onCreate方法的super方法前,调用hook webview的方法,来绕过谷歌的禁用。

具体hook的方法:https://www.52pojie.cn/thread-992014-1-1.html

继续阅读 »

1、离线打包

Hbuilder官方路径:https://nativesupport.dcloud.net.cn/AppDocs/usesdk/android

为什么要用离线打包呢,因为是开发安卓第三方插件,主要用的是Android Stuido,所以把5+APP项目导到Android studio里来,方便开发和测试。

其实还有一个原因,涉及到的第三方插件用到了系统级权限,要用platform.pk8来签名打包,才能运行。所以用离线打包会方便点。

Hbuilder(X)用不了pk8签名,当然,你可以把pk8转换成keystore文件,这样就可以签名了。

这里有大佬介绍转换,不过我还没试。(https://blog.csdn.net/langlitaojin/article/details/108045709)

2、添加第三方插件文件及支持
将第三方插件的jar包,so文件拷贝到Android studio相应的目录(app-libs)下,然后在gradle最外层配置:
repositories {
flatDir {
dirs 'libs'
}
}
在dependencies层加入:

implementation fileTree(dir: 'libs', include: ['.aar', '.jar', '*.so'], exclude: [])
注意:有so文件的话,需要在gradle的android层配置ndk支持。

ndk {
// 设置支持的SO库架构
abiFilters 'armeabi' ,'x86', 'armeabi-v7a'
}

3、创建java类封装第三方插件所要用到的功能,封装成一个个独立的方法。数据传递到js端:广播,或者用接口类回调。

这个有个地方要注意,如果注册了广播监听者,没有注销的话,应用退出再重新打开之后,会报:

IllegalArgumentException: Receiver not registered。

我用5+的方法去注销在java里注册的广播,但是没起到效果,不得其解。

然后我转而在java层封装了一个注销监听器的方法,然后在js层调用,问题就没再出现了。

所以呢,我觉得原生的方法就尽量在java层里写好,由js层调用,避免用5+来写。

这里呢,我觉得还是少用广播吧,注销是个麻烦事,在java里可以在专门的生命周期里注销,但是在js里,就麻烦了,要在各种事件(页面上的返回键或关闭键,手机上的虚拟或物理返回)上去监听做注销处理。

4、创建一个js类,用5+API来封装上面封装好的java类的方法。

用java封装完第三方库,接着就是在js也封装一个相应的api,方便前端开发人员使用,也方便维护。


注意:如果是系统级应用,那么要hook一下webview(因为webview存在安全漏洞,从安卓5.1开始,谷歌禁止系统应用使用webview)。

提示:Caused by: java.lang.UnsupportedOperationException: For security reasons, WebView is not allowed in privileged processes

解决方法:

1、首先呢,创建一个Application继承自DCloudApplication,然后在AndroidManifest.xml里,引用自己的Application,且加上tools:replace="android:name",避免与Hbuilder的lib里的DCloudApplication冲突

2、在application的onCreate方法的super方法前,调用hook webview的方法,来绕过谷歌的禁用。

具体hook的方法:https://www.52pojie.cn/thread-992014-1-1.html

收起阅读 »

canvas组件在android手机使用CanvasContext.draw可能绘制不完整的解决办法

Android canvas

在android手机的app中使用canvas组件的CanvasContext.draw方法,可能导致绘制不完整,估计原因是手机计算draw之前的一系列代码没有完成,解决办法是使用以下代码延时执行CanvasContext.draw方法。实测成功。

// #ifdef APP-PLUS  
if(plus.os.name == "Android"){  
    setTimeout(()=>{  
        this.context.draw(true, ()=>{  
            console.log('createBill success');  
            callback()  
        })  
    }, 100)  
}else{  
    this.context.draw(true, ()=>{  
        console.log('createBill success');  
        callback()  
    })  
}  
// #endif  
// #ifndef APP-PLUS  
this.context.draw(true, ()=>{  
    console.log('createBill success');  
    callback()  
})  
// #endif
继续阅读 »

在android手机的app中使用canvas组件的CanvasContext.draw方法,可能导致绘制不完整,估计原因是手机计算draw之前的一系列代码没有完成,解决办法是使用以下代码延时执行CanvasContext.draw方法。实测成功。

// #ifdef APP-PLUS  
if(plus.os.name == "Android"){  
    setTimeout(()=>{  
        this.context.draw(true, ()=>{  
            console.log('createBill success');  
            callback()  
        })  
    }, 100)  
}else{  
    this.context.draw(true, ()=>{  
        console.log('createBill success');  
        callback()  
    })  
}  
// #endif  
// #ifndef APP-PLUS  
this.context.draw(true, ()=>{  
    console.log('createBill success');  
    callback()  
})  
// #endif
收起阅读 »