HBuilderX

HBuilderX

极客开发工具
uni-app

uni-app

开发一次,多端覆盖
uniCloud

uniCloud

云开发平台
HTML5+

HTML5+

增强HTML5的功能体验
MUI

MUI

上万Star的前端框架

5+sdk 自定义插件层

混合开发 NJS 5+sdk

封装自定义插件,实现js层调用Java层代码;

封装自定义插件,实现js层调用Java层代码;

有偿解决mui,h5+,vue-cli问题

Vue mui

解决mui,h5+,vue-cli,webpack等各种前端问题,995232179

解决mui,h5+,vue-cli,webpack等各种前端问题,995232179

手机端mui演示的APP跟网站上的演示代码不统一。

手机端mui演示的APP跟网站上的演示代码不统一。有些新的模版在手机端APP上可以看到。
网站上却没有,希望能同步更新一下。谢谢

手机端mui演示的APP跟网站上的演示代码不统一。有些新的模版在手机端APP上可以看到。
网站上却没有,希望能同步更新一下。谢谢

关闭GPS后,Geolocation获取位置权限失败

maps Geolocation

HBuild 8.~ 的基座和新版本的SDK都有类似问题。这会导致在Andriod5.0和IOS上,不论是真机测试还是在线/离线打包,当关闭GPS开启其他定位途径比如WIFI/4G时,系统会提示「 获取定位权限失败 」,错误代码是 22。 这是不妥当的。

同时我发现HBuilder 7.6.5.201612301621没有此问题。

查阅最新版SDK和HBuild 8.~ 基座真机测试APK,在 io.dcloud.js.geolocation.GeolocationFeatureImpl文件中与HBuilder 7.6.5.201612301621基座打包应用的同一文件存在这样的差别:

//HBuild 8.~  
public String execute(final IWebview var1, final String var2, final String[] var3) {  
    PermissionUtil.usePermission(var1.getActivity(), var1.obtainApp().isStreamApp(), "LOCATION", new StreamPermissionRequest(var1.obtainApp()) {  
        public void onDenied(String var1x) {  
            var1x = DOMException.toJSON(22, "获取定位权限失败");  
            JSUtil.execCallback(var1, var3[0], var1x, JSUtil.ERROR, true, false);  
        }  

        public void onGranted(String var1x) {  
            GeolocationFeatureImpl.this.a.a(var1, var2, var3);  
        }  
    });  
    return null;  
}  
//HBuilder 7.6.5.201612301621  

public String execute(IWebview var1, String var2, String[] var3) {  
        this.a.a(var1, var2, var3);  
        return null;   
}  

我相信这就是出错的根源。并且为此问题困扰的用户不少。请官方尽快确认基座和SDK中这样的代码是否需要完善。谢谢!

继续阅读 »

HBuild 8.~ 的基座和新版本的SDK都有类似问题。这会导致在Andriod5.0和IOS上,不论是真机测试还是在线/离线打包,当关闭GPS开启其他定位途径比如WIFI/4G时,系统会提示「 获取定位权限失败 」,错误代码是 22。 这是不妥当的。

同时我发现HBuilder 7.6.5.201612301621没有此问题。

查阅最新版SDK和HBuild 8.~ 基座真机测试APK,在 io.dcloud.js.geolocation.GeolocationFeatureImpl文件中与HBuilder 7.6.5.201612301621基座打包应用的同一文件存在这样的差别:

//HBuild 8.~  
public String execute(final IWebview var1, final String var2, final String[] var3) {  
    PermissionUtil.usePermission(var1.getActivity(), var1.obtainApp().isStreamApp(), "LOCATION", new StreamPermissionRequest(var1.obtainApp()) {  
        public void onDenied(String var1x) {  
            var1x = DOMException.toJSON(22, "获取定位权限失败");  
            JSUtil.execCallback(var1, var3[0], var1x, JSUtil.ERROR, true, false);  
        }  

        public void onGranted(String var1x) {  
            GeolocationFeatureImpl.this.a.a(var1, var2, var3);  
        }  
    });  
    return null;  
}  
//HBuilder 7.6.5.201612301621  

public String execute(IWebview var1, String var2, String[] var3) {  
        this.a.a(var1, var2, var3);  
        return null;   
}  

我相信这就是出错的根源。并且为此问题困扰的用户不少。请官方尽快确认基座和SDK中这样的代码是否需要完善。谢谢!

收起阅读 »

Android Studio 2.1.2 离线打包

App离线打包

最近公司项目需要集成扫码枪的功能,所以只能采用插件开发,插件开发,那么就要用到离线打包了,特此记下遇到的问题

首先下载官方给的Android SDK, 然后按照步骤导入,导入项目结构如下
主体:

libs:

AndroidManifest;


    <supports-screens  
        android:anyDensity="true"  
        android:largeScreens="true"  
        android:normalScreens="true"  
        android:resizeable="true"  
        android:smallScreens="true"  
        />  
    <uses-sdk android:maxSdkVersion="8"/>  
    <uses-permission android:name="android.permission.INTERNET"/>  
    <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>  
    <uses-permission android:name="android.permission.GET_TASKS"/>  
    <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE"/>  
    <uses-permission android:name="android.permission.ACCESS_WIFI_STATE"/>  
    <uses-permission android:name="android.permission.CAMERA"/>  
    <uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE"/>  
    <uses-permission android:name="android.permission.MOUNT_UNMOUNT_FILESYSTEMS"/>  
    <application  
        android:icon="@drawable/icon"  
        android:label="@string/app_name"  
        android:largeHeap="true"  
        android:name="io.dcloud.application.DCloudApplication"  
        android:allowClearUserData="true">  
        <activity  
            android:name="io.dcloud.PandoraEntry"  
            android:configChanges="orientation|keyboardHidden|keyboard|navigation"  
            android:label="@string/app_name"  
            android:launchMode="singleTask"  
            android:hardwareAccelerated="true"  
            android:theme="@style/TranslucentTheme"  
            android:screenOrientation="user"  
            android:windowSoftInputMode="adjustResize" >  
            <intent-filter>  
                <action android:name="android.intent.action.MAIN" />  

                <category android:name="android.intent.category.LAUNCHER" />  
            </intent-filter>  
        </activity>  
        <activity  
            android:name="io.dcloud.PandoraEntryActivity"  
            android:configChanges="orientation|keyboardHidden|screenSize|keyboard|navigation|mcc|mnc|fontScale"  
            android:hardwareAccelerated="true"  
            android:label="5+Debug"  
            android:launchMode="singleTask"  
            android:screenOrientation="user"  
            android:theme="@style/DCloudTheme"  
            android:windowSoftInputMode="adjustResize" >  
        </activity>  

        <service  
            android:name="io.dcloud.common.adapter.io.MiniServerService"  
            android:exported="true" />  

    </application>

运行成功,如下

重要点:
1.assets 文件夹下的 apps 和 www 为固定文件夹名称
2.java 中 io.dcloud该包名也是固定的,记住千万别写错地方了 本人一开始就是写错地方了,一直找不到StreamAppMainActivity,郁闷死

  1. android 项目自己的清单文件中 要额外加上
    <uses-permission android:name="android.permission.ACCESS_WIFI_STATE"/> 

    不然会报错找不到RInformation ,
    4.web项目:manifest 中的的id标识改为和name 一样,不要用他自己默认生成的id,不然已开始运行会是空白页,因为不是在线打包~,这里在data 文件夹下的 dcloud_control 文件中会用到

  2. dcloud_control 中的 appid 和 appver分贝对应web 项目manifest中 id和version节点下的name
继续阅读 »

最近公司项目需要集成扫码枪的功能,所以只能采用插件开发,插件开发,那么就要用到离线打包了,特此记下遇到的问题

首先下载官方给的Android SDK, 然后按照步骤导入,导入项目结构如下
主体:

libs:

AndroidManifest;


    <supports-screens  
        android:anyDensity="true"  
        android:largeScreens="true"  
        android:normalScreens="true"  
        android:resizeable="true"  
        android:smallScreens="true"  
        />  
    <uses-sdk android:maxSdkVersion="8"/>  
    <uses-permission android:name="android.permission.INTERNET"/>  
    <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>  
    <uses-permission android:name="android.permission.GET_TASKS"/>  
    <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE"/>  
    <uses-permission android:name="android.permission.ACCESS_WIFI_STATE"/>  
    <uses-permission android:name="android.permission.CAMERA"/>  
    <uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE"/>  
    <uses-permission android:name="android.permission.MOUNT_UNMOUNT_FILESYSTEMS"/>  
    <application  
        android:icon="@drawable/icon"  
        android:label="@string/app_name"  
        android:largeHeap="true"  
        android:name="io.dcloud.application.DCloudApplication"  
        android:allowClearUserData="true">  
        <activity  
            android:name="io.dcloud.PandoraEntry"  
            android:configChanges="orientation|keyboardHidden|keyboard|navigation"  
            android:label="@string/app_name"  
            android:launchMode="singleTask"  
            android:hardwareAccelerated="true"  
            android:theme="@style/TranslucentTheme"  
            android:screenOrientation="user"  
            android:windowSoftInputMode="adjustResize" >  
            <intent-filter>  
                <action android:name="android.intent.action.MAIN" />  

                <category android:name="android.intent.category.LAUNCHER" />  
            </intent-filter>  
        </activity>  
        <activity  
            android:name="io.dcloud.PandoraEntryActivity"  
            android:configChanges="orientation|keyboardHidden|screenSize|keyboard|navigation|mcc|mnc|fontScale"  
            android:hardwareAccelerated="true"  
            android:label="5+Debug"  
            android:launchMode="singleTask"  
            android:screenOrientation="user"  
            android:theme="@style/DCloudTheme"  
            android:windowSoftInputMode="adjustResize" >  
        </activity>  

        <service  
            android:name="io.dcloud.common.adapter.io.MiniServerService"  
            android:exported="true" />  

    </application>

运行成功,如下

重要点:
1.assets 文件夹下的 apps 和 www 为固定文件夹名称
2.java 中 io.dcloud该包名也是固定的,记住千万别写错地方了 本人一开始就是写错地方了,一直找不到StreamAppMainActivity,郁闷死

  1. android 项目自己的清单文件中 要额外加上
    <uses-permission android:name="android.permission.ACCESS_WIFI_STATE"/> 

    不然会报错找不到RInformation ,
    4.web项目:manifest 中的的id标识改为和name 一样,不要用他自己默认生成的id,不然已开始运行会是空白页,因为不是在线打包~,这里在data 文件夹下的 dcloud_control 文件中会用到

  2. dcloud_control 中的 appid 和 appver分贝对应web 项目manifest中 id和version节点下的name
收起阅读 »

HBuilder Alpha版8.8.2发布!支持真机运行自定义基座运行!

真机调试 HBuilder

HBuilder Alpha版8.8.2发布!支持真机运行自定义基座运行!支持远程调试Android设备,无需翻墙!!!

下载地址:

https://pan.baidu.com/s/1i5CB1u1

ReleaseNote:

IDE

  • 【重要】真机运行添加自定义基座运行功能,使用方法同真机运行。教程参考:https://ask.dcloud.net.cn/article/12723
  • 【重要】新增调试Android设备应用的功能(无需翻墙!!!运行时会自动切换右上角webview调试视图)
  • 优化设置默认编辑器的体验(可直接右键【打开方式】-【选择默认编辑器...】)
  • 修复创建web项目时在某些机器上输入项目名称会卡的问题
  • 修复html标签带“-”号时的高亮问题
  • 新建移动App时,增加原生tab选项卡项目模板,教程参考:http://ask.dcloud.net.cn/article/12602
  • 新建HTML页面时,支持选择单webview模式下拉刷新页面组模板
  • 新建HTML页面时,支持选择列表到详情最佳实践页面组模板

App

  • 新增Map地图控件对象支持关闭(close)操作
  • Android平台修复压缩图片在部分设备上可能出现崩溃的问题
  • Android平台修复百度地图在部分设备上可能无法正常显示标点图片的问题
  • iOS平台修复应用中存在侧滑菜单通过wgt升级更新后重启应用侧滑菜单显示不正常的问题

MUI

  • 解决DIV模式的时间选择器,点击遮罩或取消按钮,反复关闭/显示,重复创建picker控件的bug
继续阅读 »

HBuilder Alpha版8.8.2发布!支持真机运行自定义基座运行!支持远程调试Android设备,无需翻墙!!!

下载地址:

https://pan.baidu.com/s/1i5CB1u1

ReleaseNote:

IDE

  • 【重要】真机运行添加自定义基座运行功能,使用方法同真机运行。教程参考:https://ask.dcloud.net.cn/article/12723
  • 【重要】新增调试Android设备应用的功能(无需翻墙!!!运行时会自动切换右上角webview调试视图)
  • 优化设置默认编辑器的体验(可直接右键【打开方式】-【选择默认编辑器...】)
  • 修复创建web项目时在某些机器上输入项目名称会卡的问题
  • 修复html标签带“-”号时的高亮问题
  • 新建移动App时,增加原生tab选项卡项目模板,教程参考:http://ask.dcloud.net.cn/article/12602
  • 新建HTML页面时,支持选择单webview模式下拉刷新页面组模板
  • 新建HTML页面时,支持选择列表到详情最佳实践页面组模板

App

  • 新增Map地图控件对象支持关闭(close)操作
  • Android平台修复压缩图片在部分设备上可能出现崩溃的问题
  • Android平台修复百度地图在部分设备上可能无法正常显示标点图片的问题
  • iOS平台修复应用中存在侧滑菜单通过wgt升级更新后重启应用侧滑菜单显示不正常的问题

MUI

  • 解决DIV模式的时间选择器,点击遮罩或取消按钮,反复关闭/显示,重复创建picker控件的bug
收起阅读 »

如何用AST语法树对代码“动手脚”

代码助手

作为程序猿,每天都在写代码,但是有没有想过通过代码对写好的代码”动点手脚”呢?今天就与大家分享——

先抛一个问题:如何将图一代码改写为图二?


图1


图2

此题需要把代码中和程序逻辑无关的字符串提取出来,替换为id。比如个推日志输出类,缩短日志描述信息后,输出的日志就随之变短,根据映射表可以恢复真实原始日志。

通过何种方案改写?

你可能会想通过万能的“正则表达式”匹配替换,但当代码较为复杂时(如下图所示),使用“正则表达法”则会将问题复杂化,难以确保所有代码的完美覆盖并匹配。若通过AST语法树,可以很好地解决此问题。

什么是AST语法树?

AST(Abstract syntax tree)即为“抽象语法树”,简称语法树,指代码在计算机内存的一种树状数据结构,便于计算机理解和阅读。

一般只有语言的编译器开发人员或者从事语言设计的人员才涉及到语法树的提取和处理,所以很多人会对这个概念比较陌生。

上图即为语法树,左边树的节点对应右边相同颜色覆盖的代码块。

众所周知,Java 编译流程(上图)中也有对AST语法树的提取处理,那是否可以在此环节操作语法树呢?由于编译链代码栈太深,鲜有对外的接口和文档,使得其可操作性不强。不过,如果采用迂回战术如下图所示,可以对其进行操作。


个推log-rewrite项目改写日志,就是用AST语法树进行的,流程图如下图所示。

先把所有源码解析为AST语法树,遍历每一个编译单元与单元的类声明,在类声明里根据日志方法的签名找到所有的方法调用,然后遍历每个方法调用,将方法调用的第二个参数表达式放入递归方法,对字符串字面值进行改写。

对应的代码较为简短, 使用github的 Netflix-Skunkworks/rewrite开源库与kotlin语言,能读懂Java的你也一定能读明白。

如果想将日志恢复原样,可根据前缀、后缀定制正则表达式,逐行匹配替换。如下图所示。

AST有哪些应用场景?

1、 编译工具从ant到gradle的切换

此项目起步于ant主流时期,随着技术日渐成熟,gradle逐渐取代了ant的位置,演变成官方的编译打包方式。因为历史原因,若直接将上图类似预编译的代码切换到gradle较为棘手,通过AST语法树重写,再用gradle编译,就可以解决此问题。

上图的#debug和#mdebug指令,也可以通过AST改写之后再进行编译。

2、 自动静态埋点

代码中需要运营统计、数据分析等,需要通过代码埋点进行用户行为数据收集。传统的做法是手动在代码中添加埋点代码,但此过程较为繁琐,可能会对业务代码造成干扰,倘若通过改写AST语法树,在编译打包期添加这种类似的埋点代码,就可减少不必要的繁琐过程,使其更加高效。

最后附推荐操作AST类库链接&完整项目源码地址,希望可以帮助大家打开脑洞,设想更多的应用场景。

推荐操作AST类库链接

https://github.com/Netflix-Skunkworks/rewrite

https://github.com/Javaparser/Javaparser

https://github.com/antlr/antlr4

完整项目源码地址如下,欢迎fork&start

https://github.com/foxundermoon/log-rewrite

继续阅读 »

作为程序猿,每天都在写代码,但是有没有想过通过代码对写好的代码”动点手脚”呢?今天就与大家分享——

先抛一个问题:如何将图一代码改写为图二?


图1


图2

此题需要把代码中和程序逻辑无关的字符串提取出来,替换为id。比如个推日志输出类,缩短日志描述信息后,输出的日志就随之变短,根据映射表可以恢复真实原始日志。

通过何种方案改写?

你可能会想通过万能的“正则表达式”匹配替换,但当代码较为复杂时(如下图所示),使用“正则表达法”则会将问题复杂化,难以确保所有代码的完美覆盖并匹配。若通过AST语法树,可以很好地解决此问题。

什么是AST语法树?

AST(Abstract syntax tree)即为“抽象语法树”,简称语法树,指代码在计算机内存的一种树状数据结构,便于计算机理解和阅读。

一般只有语言的编译器开发人员或者从事语言设计的人员才涉及到语法树的提取和处理,所以很多人会对这个概念比较陌生。

上图即为语法树,左边树的节点对应右边相同颜色覆盖的代码块。

众所周知,Java 编译流程(上图)中也有对AST语法树的提取处理,那是否可以在此环节操作语法树呢?由于编译链代码栈太深,鲜有对外的接口和文档,使得其可操作性不强。不过,如果采用迂回战术如下图所示,可以对其进行操作。


个推log-rewrite项目改写日志,就是用AST语法树进行的,流程图如下图所示。

先把所有源码解析为AST语法树,遍历每一个编译单元与单元的类声明,在类声明里根据日志方法的签名找到所有的方法调用,然后遍历每个方法调用,将方法调用的第二个参数表达式放入递归方法,对字符串字面值进行改写。

对应的代码较为简短, 使用github的 Netflix-Skunkworks/rewrite开源库与kotlin语言,能读懂Java的你也一定能读明白。

如果想将日志恢复原样,可根据前缀、后缀定制正则表达式,逐行匹配替换。如下图所示。

AST有哪些应用场景?

1、 编译工具从ant到gradle的切换

此项目起步于ant主流时期,随着技术日渐成熟,gradle逐渐取代了ant的位置,演变成官方的编译打包方式。因为历史原因,若直接将上图类似预编译的代码切换到gradle较为棘手,通过AST语法树重写,再用gradle编译,就可以解决此问题。

上图的#debug和#mdebug指令,也可以通过AST改写之后再进行编译。

2、 自动静态埋点

代码中需要运营统计、数据分析等,需要通过代码埋点进行用户行为数据收集。传统的做法是手动在代码中添加埋点代码,但此过程较为繁琐,可能会对业务代码造成干扰,倘若通过改写AST语法树,在编译打包期添加这种类似的埋点代码,就可减少不必要的繁琐过程,使其更加高效。

最后附推荐操作AST类库链接&完整项目源码地址,希望可以帮助大家打开脑洞,设想更多的应用场景。

推荐操作AST类库链接

https://github.com/Netflix-Skunkworks/rewrite

https://github.com/Javaparser/Javaparser

https://github.com/antlr/antlr4

完整项目源码地址如下,欢迎fork&start

https://github.com/foxundermoon/log-rewrite

收起阅读 »

DCloud APP升级代码的实现

HBuilder
//系统自动更新  
    update: function() {  
        if(window.plus) {  
            this.updateCheck();  
        } else {  
            document.addEventListener('plusready', this.updateCheck, false);  
        }  
    },  
    //系统升级检测  
    updateCheck: function() {  
        var appVer = ''; //app版本  
        var newVer = ''; //最新版本  
        //获得当前版本  
        plus.runtime.getProperty(plus.runtime.appid, function(inf) {  
            appVer = inf.version;  
            $('.copyright').html('湖南互联移动科技有限公司提供技术支持v' + appVer);  
            //发起新版本请求检测  
            sysCom.get(urlCom.apiUrl.update_path + "/version.html?v=" + (new Date().getTime()), {}, function(data) {  
                newVer = data.version;  
                if(appVer != newVer) {  
                    var waiting = plus.nativeUI.showWaiting("正在下载数据更新资源包 0%...", {  
                        width: '100%',  
                        height: '100%',  
                        back: 'none',  
                        round: 1,  
                    });  

                    //模拟下载百分比动画  
                    var _sec = 1;  
                    var _add = 1;  
                    var _filename = ''; //下载好的更新文件  
                    var _timer = setInterval(function() {  
                        _add = Math.floor(Math.random() * 10);  
                        _sec += _add;  
                        if(_sec >= 100) {  
                            _sec = 99;  
                            if(_filename) {  
                                clearInterval(_timer);  
                                waiting.setTitle('正在下载数据资源包 100%...');  

                                // 安装更新包  
                                plus.runtime.install(_filename, {}, function() {  
                                    waiting.setTitle('数据资源包下载完成,正在重启应用...');  
                                    //更新完毕删除更新包  
                                    plus.io.resolveLocalFileSystemURL(_filename, function(entity) {  
                                        entity.remove();  
                                    }, function(error) {  
                                        debugCom.log(error.message);  
                                    });  
                                    //应用重启并显示启动页  
                                    dataCom.remove(dataBase.names.data_guide);  
                                    setTimeout(function() {  
                                        plus.nativeUI.closeWaiting();  
                                        plus.runtime.restart();  
                                    }, 1000)  
                                }, function(e) {  
                                    waiting.setTitle('更新失败:' + e.message);  
                                });  
                            }  

                        }  
                        waiting.setTitle('正在下载数据资源包 ' + _sec + '%...');  
                    }, 500);  
                    //--  

                    //下载更新包  
                    plus.downloader.createDownload(urlCom.apiUrl.update_path + "/" + newVer + ".wgt", {  
                        filename: "_doc/update/"  
                    }, function(d, status) {  
                        if(status == 200) {  
                            _filename = d.filename;  
                        } else {  
                            debugCom.log('下载资源包出现问题:' + status)  
                        }  
                    }).start();  
                    //--  
                }  

            });  
        })  
    }
继续阅读 »
//系统自动更新  
    update: function() {  
        if(window.plus) {  
            this.updateCheck();  
        } else {  
            document.addEventListener('plusready', this.updateCheck, false);  
        }  
    },  
    //系统升级检测  
    updateCheck: function() {  
        var appVer = ''; //app版本  
        var newVer = ''; //最新版本  
        //获得当前版本  
        plus.runtime.getProperty(plus.runtime.appid, function(inf) {  
            appVer = inf.version;  
            $('.copyright').html('湖南互联移动科技有限公司提供技术支持v' + appVer);  
            //发起新版本请求检测  
            sysCom.get(urlCom.apiUrl.update_path + "/version.html?v=" + (new Date().getTime()), {}, function(data) {  
                newVer = data.version;  
                if(appVer != newVer) {  
                    var waiting = plus.nativeUI.showWaiting("正在下载数据更新资源包 0%...", {  
                        width: '100%',  
                        height: '100%',  
                        back: 'none',  
                        round: 1,  
                    });  

                    //模拟下载百分比动画  
                    var _sec = 1;  
                    var _add = 1;  
                    var _filename = ''; //下载好的更新文件  
                    var _timer = setInterval(function() {  
                        _add = Math.floor(Math.random() * 10);  
                        _sec += _add;  
                        if(_sec >= 100) {  
                            _sec = 99;  
                            if(_filename) {  
                                clearInterval(_timer);  
                                waiting.setTitle('正在下载数据资源包 100%...');  

                                // 安装更新包  
                                plus.runtime.install(_filename, {}, function() {  
                                    waiting.setTitle('数据资源包下载完成,正在重启应用...');  
                                    //更新完毕删除更新包  
                                    plus.io.resolveLocalFileSystemURL(_filename, function(entity) {  
                                        entity.remove();  
                                    }, function(error) {  
                                        debugCom.log(error.message);  
                                    });  
                                    //应用重启并显示启动页  
                                    dataCom.remove(dataBase.names.data_guide);  
                                    setTimeout(function() {  
                                        plus.nativeUI.closeWaiting();  
                                        plus.runtime.restart();  
                                    }, 1000)  
                                }, function(e) {  
                                    waiting.setTitle('更新失败:' + e.message);  
                                });  
                            }  

                        }  
                        waiting.setTitle('正在下载数据资源包 ' + _sec + '%...');  
                    }, 500);  
                    //--  

                    //下载更新包  
                    plus.downloader.createDownload(urlCom.apiUrl.update_path + "/" + newVer + ".wgt", {  
                        filename: "_doc/update/"  
                    }, function(d, status) {  
                        if(status == 200) {  
                            _filename = d.filename;  
                        } else {  
                            debugCom.log('下载资源包出现问题:' + status)  
                        }  
                    }).start();  
                    //--  
                }  

            });  
        })  
    }
收起阅读 »

DCloud APP中更改状态栏背景色和字体颜色

HBuilder
//更改状态栏颜色  
mui.plusReady(function() {  
    plus.navigator.setStatusBarStyle("UIStatusBarStyleBlackOpaque");  
    plus.navigator.setStatusBarBackground('#1A2448');  
})
继续阅读 »
//更改状态栏颜色  
mui.plusReady(function() {  
    plus.navigator.setStatusBarStyle("UIStatusBarStyleBlackOpaque");  
    plus.navigator.setStatusBarBackground('#1A2448');  
})
收起阅读 »

DCloud图片上传和压缩

HBuilder

define(['common', 'config'], function(com, con) {  
    /*  
     * 打开摄像头、打开图库 模块  
     */  
    return {  
        //model对象  
        _model: {  
            result: true,  
            id: 0,  
            img: ""  
        },  
        //记录上传文件数  
        upTimer: {  
            count: 0,  
            imgs: []  
        },  
        //打开摄像头  
        open: function(obj, callback) {  
            my = this;  
            mui.plusReady(function() {  
                if($(obj).attr('data-camera-gallery') == "1") {  
                    var a = [{  
                        title: "拍照"  
                    }, {  
                        title: "从手机相册选择"  
                    }];  
                    plus.nativeUI.actionSheet({  
                        //title: "修改用户头像",  
                        cancel: "取消",  
                        buttons: a  
                    }, function(b) {  
                        /*actionSheet 按钮点击事件*/  
                        switch(b.index) {  
                            case 0:  
                                break;  
                            case 1:  
                                my.getImage(obj, callback);  
                                break;  
                            case 2:  
                                my.galleryImg(obj, callback);  
                                break;  
                            default:  
                                break;  
                        }  
                    });  
                } else {  
                    my.getImage(obj, callback);  
                }  
            });  
        },  
        //拍照  
        getImage: function(obj, callback) {  
            var my = this;  
            var photoType = $(obj).attr("data-PhotoType") ? $(obj).attr("data-PhotoType") : "";  
            mui.plusReady(function() {  
                var data = {  
                    result: false,  
                    msg: '',  
                    data: null  
                };  
                var c = plus.camera.getCamera();  
                c.captureImage(function(e) {  
                    $(obj).css('opacity', '0.3').attr('disabled', true);  
                    plus.io.resolveLocalFileSystemURL(e, function(entry) {  
                        var s = entry.toLocalURL();  
                        data.result = true;  
                        data.data = s;  
                        my.upload(obj, con.urlCONFIG.post_upload, s, callback, photoType);  
                    }, function(e) {  
                        data.data = "读取拍照文件错误:" + e.message;  
                        callback(data);  
                    });  
                }, function(error) {  
                    data.msg = error.message;  
                    //callback(data);  
                })  
            });  
        },  
        //打开相册  
        galleryImg: function(obj, callback) {  
            var my = this;  
            plus.gallery.pick(function(a) {  
                var photoType = $(obj).attr("data-PhotoType") ? $(obj).attr("data-PhotoType") : "";  
                var data = {  
                    result: false,  
                    msg: '',  
                    data: null  
                };  
                $(obj).css('opacity', '0.3').attr('disabled', true);  
                plus.io.resolveLocalFileSystemURL(a, function(entry) {  
                    var s = entry.toLocalURL();  
                    data.result = true;  
                    data.data = s;  
                    my.upload(obj, com.urlCONFIG.post_upload, s, callback, photoType);  
                }, function(e) {  
                    data.data = "读取拍照文件错误:" + e.message;  
                    callback(data);  
                });  
            }, function(a) {}, {  
                filter: "image"  
            })  
        },  
        //上传图片到服务器  
        upload: function(obj, url, filename, callback, photoType) {  
            var my = this;  
            my.upTimer.count++;  
            var tips = com.msg(my.upTimer.count + '个文件正在上传', 999);  
            mui.plusReady(function() {  

                var task = plus.uploader.createUpload(url, {  
                        method: "POST",  
                        blocksize: 0,  
                        priority: 100  
                    },  
                    function(t, status) {  
                        $(obj).css('opacity', '1').removeAttr('disabled');  
                        var json_data = t.responseText.replace('null(','').replace(');null','');  
                        //console.log(json_data)  
                        var data = JSON.parse(json_data);  
                        if(data) {  
                            // 上传完成  
                            if(status == 200) {  
                                my.upTimer.count--;  
                                if(my.upTimer.count <= 0) {  
                                    com.msg('所有图片上传完毕', 1);  
                                }  
                                var model = _.clone(my._model);  
                                model.id = new Date().getTime();  
                                model.img = data.data;  
                                my.upTimer.imgs.push(model);  
                                callback(model);  
                            } else {  
                                callback(data);  
                            }  
                        } else {  
                            com.msg('上传失败:' + data.msg, 0);  
                        }  
                    }  
                );  
                //图片压缩  
                my.resize(filename, function(zipSrc) {  
                    task.addFile(zipSrc, {  
                        key: "upload"  
                    });  
                    task.addData(zipSrc, zipSrc);  
                    task.start();  
                });  
            });  
        },  
        //压缩(需要获取本地文件权限)  
        resize: function(src, callback) {  
            var filename = src.substring(src.lastIndexOf('/') + 1);  
            plus.zip.compressImage({  
                    src: src,  
                    dst: '_doc/' + filename,  
                    overwrite: true,  
                    width: '1000px', //这里指定了宽度,同样可以修改  
                    format: 'jpg',  
                    quality: 90 //图片质量不再修改,以免失真  
                },  
                function(e) {  
                    callback(e.target);  
                },  
                function(err) {  
                    com.alert('未知错误!', 0, function() {  
                        mui.back();  
                    })  
                })  
        }  
    };  
})
继续阅读 »

define(['common', 'config'], function(com, con) {  
    /*  
     * 打开摄像头、打开图库 模块  
     */  
    return {  
        //model对象  
        _model: {  
            result: true,  
            id: 0,  
            img: ""  
        },  
        //记录上传文件数  
        upTimer: {  
            count: 0,  
            imgs: []  
        },  
        //打开摄像头  
        open: function(obj, callback) {  
            my = this;  
            mui.plusReady(function() {  
                if($(obj).attr('data-camera-gallery') == "1") {  
                    var a = [{  
                        title: "拍照"  
                    }, {  
                        title: "从手机相册选择"  
                    }];  
                    plus.nativeUI.actionSheet({  
                        //title: "修改用户头像",  
                        cancel: "取消",  
                        buttons: a  
                    }, function(b) {  
                        /*actionSheet 按钮点击事件*/  
                        switch(b.index) {  
                            case 0:  
                                break;  
                            case 1:  
                                my.getImage(obj, callback);  
                                break;  
                            case 2:  
                                my.galleryImg(obj, callback);  
                                break;  
                            default:  
                                break;  
                        }  
                    });  
                } else {  
                    my.getImage(obj, callback);  
                }  
            });  
        },  
        //拍照  
        getImage: function(obj, callback) {  
            var my = this;  
            var photoType = $(obj).attr("data-PhotoType") ? $(obj).attr("data-PhotoType") : "";  
            mui.plusReady(function() {  
                var data = {  
                    result: false,  
                    msg: '',  
                    data: null  
                };  
                var c = plus.camera.getCamera();  
                c.captureImage(function(e) {  
                    $(obj).css('opacity', '0.3').attr('disabled', true);  
                    plus.io.resolveLocalFileSystemURL(e, function(entry) {  
                        var s = entry.toLocalURL();  
                        data.result = true;  
                        data.data = s;  
                        my.upload(obj, con.urlCONFIG.post_upload, s, callback, photoType);  
                    }, function(e) {  
                        data.data = "读取拍照文件错误:" + e.message;  
                        callback(data);  
                    });  
                }, function(error) {  
                    data.msg = error.message;  
                    //callback(data);  
                })  
            });  
        },  
        //打开相册  
        galleryImg: function(obj, callback) {  
            var my = this;  
            plus.gallery.pick(function(a) {  
                var photoType = $(obj).attr("data-PhotoType") ? $(obj).attr("data-PhotoType") : "";  
                var data = {  
                    result: false,  
                    msg: '',  
                    data: null  
                };  
                $(obj).css('opacity', '0.3').attr('disabled', true);  
                plus.io.resolveLocalFileSystemURL(a, function(entry) {  
                    var s = entry.toLocalURL();  
                    data.result = true;  
                    data.data = s;  
                    my.upload(obj, com.urlCONFIG.post_upload, s, callback, photoType);  
                }, function(e) {  
                    data.data = "读取拍照文件错误:" + e.message;  
                    callback(data);  
                });  
            }, function(a) {}, {  
                filter: "image"  
            })  
        },  
        //上传图片到服务器  
        upload: function(obj, url, filename, callback, photoType) {  
            var my = this;  
            my.upTimer.count++;  
            var tips = com.msg(my.upTimer.count + '个文件正在上传', 999);  
            mui.plusReady(function() {  

                var task = plus.uploader.createUpload(url, {  
                        method: "POST",  
                        blocksize: 0,  
                        priority: 100  
                    },  
                    function(t, status) {  
                        $(obj).css('opacity', '1').removeAttr('disabled');  
                        var json_data = t.responseText.replace('null(','').replace(');null','');  
                        //console.log(json_data)  
                        var data = JSON.parse(json_data);  
                        if(data) {  
                            // 上传完成  
                            if(status == 200) {  
                                my.upTimer.count--;  
                                if(my.upTimer.count <= 0) {  
                                    com.msg('所有图片上传完毕', 1);  
                                }  
                                var model = _.clone(my._model);  
                                model.id = new Date().getTime();  
                                model.img = data.data;  
                                my.upTimer.imgs.push(model);  
                                callback(model);  
                            } else {  
                                callback(data);  
                            }  
                        } else {  
                            com.msg('上传失败:' + data.msg, 0);  
                        }  
                    }  
                );  
                //图片压缩  
                my.resize(filename, function(zipSrc) {  
                    task.addFile(zipSrc, {  
                        key: "upload"  
                    });  
                    task.addData(zipSrc, zipSrc);  
                    task.start();  
                });  
            });  
        },  
        //压缩(需要获取本地文件权限)  
        resize: function(src, callback) {  
            var filename = src.substring(src.lastIndexOf('/') + 1);  
            plus.zip.compressImage({  
                    src: src,  
                    dst: '_doc/' + filename,  
                    overwrite: true,  
                    width: '1000px', //这里指定了宽度,同样可以修改  
                    format: 'jpg',  
                    quality: 90 //图片质量不再修改,以免失真  
                },  
                function(e) {  
                    callback(e.target);  
                },  
                function(err) {  
                    com.alert('未知错误!', 0, function() {  
                        mui.back();  
                    })  
                })  
        }  
    };  
})
收起阅读 »