HBuilderX

HBuilderX

极客开发工具
uni-app

uni-app

开发一次,多端覆盖
uniCloud

uniCloud

云开发平台
HTML5+

HTML5+

增强HTML5的功能体验
MUI

MUI

上万Star的前端框架

android studio 的离线打包指南在哪里?不会只有 eclipse ADT 吧?

能不能请官方出个 android studio 的离线打包指南?

android studio 都已经出几年了,也是 google 官方指定的使用的 IDE
没道理只有 eclipse ADT bundle 离线打包 的指南吧?

能不能请官方出个 android studio 的离线打包指南?

android studio 都已经出几年了,也是 google 官方指定的使用的 IDE
没道理只有 eclipse ADT bundle 离线打包 的指南吧?

【分享】一个Notification 进度条插件(android,NJS实现,直接就可使用)

NJS 通知栏显示进度 通知栏 通知栏进度条

如题,分享一个Notification 进度条插件(android,用js调用原生api实现,直接就可以使用).
参考1: http://ask.dcloud.net.cn/article/155
参考2:http://ask.dcloud.net.cn/question/2464

详细介绍: 最近有一个需求是,android更新资源包时,需要在通知栏里显示下载进度条,于是就搜索了下已有的解决方案
发现并没有现成的解决方案,于是参考了以上两个解决方案,结合了下,实现了直接能调用的js插件.

第一步(分析以上两种方案的缺陷):
第一种:功能上能实现需求,但是使用起来太麻烦,而且也不方便调试(需要离线打包后才能看到效果),
而且,我这里还遇到了一个问题,在 hbuild 6.9.2 中,我明明已经添加了自定义模块权限,但是却一直提示我 ***权限没有添加, 真的是把我弄的吐血了, 所以没办法,只能另谋他路.

第二种:使用起来很方便,但是却没有完全达到功能要求(只显示了普通通知,但没有显示进度条),而且在api <16 的机子上会报错.
于是在这个基础上,结合第一种方法.写了一个 工具类,实现android的通知栏控制(兼容了api11-16的通知显示)

源码:

/**  
 * @description njs实现android原生功能   
 * 1.通知栏消息  
 * @see http://ask.dcloud.net.cn/article/503  
 *   
 * @author dailc  
 * @version 1.0  
 * @time 2016-01-08 08:38:20  
 */  
(function(obj) {  
    var defaultTitle = '通知栏标题';  
    var defaultContent = '通知内容';  
    var defaultTicker = '通知提示';  
    var defaultNotifyId = 1000;  
    var defaultNumber = 1;  
    /**  
     * plusReady  
     * @param {type} callback  
     * @returns {Window}  
     */  
    obj.plusReady = function(callback) {  
        if (window.plus) {  
            setTimeout(function() { //解决callback与plusready事件的执行时机问题(典型案例:showWaiting,closeWaiting)  
                callback();  
            }, 0);  
        } else {  
            document.addEventListener("plusready", function() {  
                callback();  
            }, false);  
        }  
        return this;  
    };  
    /**  
     * @description 比较两个版本大小  
     * 比较版本大小,如果新版本nowVersion大于旧版本OldResourceVersion则返回true,否则返回false  
     */  
    function compareVersion(OldVersion, nowVersion) {  
        if (!OldVersion || !nowVersion || OldVersion == '' || nowVersion == '') {  

            return false;  
        }  
        //第二份参数 是 数组的最大长度  
        var OldVersionA = OldVersion.split(".", 4);  
        var nowVersionA = nowVersion.split(".", 4);  
        for (var i = 0; i < OldVersionA.length && i < nowVersionA.length; i++) {  
            var strOld = OldVersionA[i];  
            var numOld = parseInt(strOld);  
            var strNow = nowVersionA[i];  
            var numNow = parseInt(strNow);  
            //小版本到高版本  
            if (numNow > numOld  
                //||strNow.length>strOld.length  
            ) {  
                return true;  
            } else if (numNow < numOld) {  
                return false;  
            }  
        }  
        //如果是版本  如 1.6 - 1.6.1  
        if (nowVersionA.length > OldVersionA.length && 0 == nowVersion.indexOf(OldVersion)) {  
            return true;  
        }  
    };  
    /**  
     * @description 通过push功能来推送消息  
     */  
    obj.sendNotificationByPush = function() {  
        var options = {  
            cover: false  
        };  
        var str = ": 欢迎使用Html5 Plus创建本地消息!";  
        plus.push.createMessage(str, "LocalMSG", options);  
    };  
    (function() {  
        /**  
         * @constructor 创建通知栏进度条构造函数  
         */  
        function NotificationCustom() {  
            if (plus.os.name != 'Android') {  
                return;  
            }  
            //当前版本号  
            var SystemVersion = plus.os.version;  
            var Context = plus.android.importClass("android.content.Context");  
            var main = plus.android.runtimeMainActivity();  
            var NotificationManager = plus.android.importClass("android.app.NotificationManager");  
            var nm = main.getSystemService(Context.NOTIFICATION_SERVICE)  
                // Notification build 要android api16以上才能使用(4.1.2以上)  
            var Notification = null;  
            if (compareVersion('4.1.1', SystemVersion) == true) {  
                Notification = plus.android.importClass("android.app.Notification");  
            } else {  
                Notification = plus.android.importClass("android.support.v4.app.NotificationCompat");  
            }  
            if (Notification) {  
                this.notifyManager = nm;  
                this.mNotificationBuild = new Notification.Builder(main);  
                //设为true代表常驻状态栏  
                this.mNotificationBuild.setOngoing(false);  
                this.mNotificationBuild.setContentTitle(defaultTitle);  
                this.mNotificationBuild.setContentText(defaultContent);  
                this.mNotificationBuild.setTicker(defaultTicker);  
                //默认的push图标  
                this.mNotificationBuild.setSmallIcon(17301620);  
                //设置默认声音  
                //console.log('默认:'+plus.android.importClass("android.app.Notification").DEFAULT_SOUND);  
                this.mNotificationBuild.setDefaults(plus.android.importClass("android.app.Notification").DEFAULT_SOUND);  
                //this.mNotificationBuild.setNumber(defaultNumber)  
            }  
        };  
        /**  
         * @description 给android通知栏发送通知  
         * @param {String} title 标题  
         * @param {String} content  内容  
         * @param {String} tickerTips  提示  
         * @param {Number} notifyId id,默认为1000  
         */  
        NotificationCustom.prototype.setNotification = function(title, content, tickerTips,notifyId) {  
            if (this.mNotificationBuild == null ||  
                this.notifyManager == null) {  
                return;  
            }  
            notifyId = (typeof(notifyId)=='number')?notifyId:defaultNotifyId;  
            title = title || defaultTitle;  
            content = content || defaultContent;  
            tickerTips = tickerTips || defaultTicker;  
            this.mNotificationBuild.setContentTitle(title);  
            this.mNotificationBuild.setContentText(content);  
            this.mNotificationBuild.setTicker(tickerTips);  
            //默认有声音  
            this.mNotificationBuild.setDefaults(plus.android.importClass("android.app.Notification").DEFAULT_SOUND);  
            this.notifyManager.notify(notifyId, this.mNotificationBuild.build());  
        };  
        /**  
         * @description 设置进度条  
         * @param {Number} progress  
         * @param {String} title 标题  
         * @param {String} content  内容  
         * @param {String} tickerTips  提示  
         * @param {Number} notifyId id,默认为1000  
         */  
        NotificationCustom.prototype.setProgress = function(progress, title, content, tickerTips,notifyId) {  
            if (this.mNotificationBuild == null ||  
                this.notifyManager == null) {  
                return;  
            }  
            notifyId = (typeof(notifyId)=='number')?notifyId:defaultNotifyId;  
            title = title || '正在下载';  
            content = content || '正在下载';  
            tickerTips = tickerTips || '进度提示';  
            //          tickerTips = tickerTips || defaultTicker;  
            this.mNotificationBuild.setContentTitle(title);  
            this.mNotificationBuild.setContentText(content);  
            this.mNotificationBuild.setTicker(tickerTips);  
            //进度条显示时,默认无声音  
            this.mNotificationBuild.setDefaults(0);  
            this.mNotificationBuild.setProgress(100, progress, false);  
            this.notifyManager.notify(notifyId, this.mNotificationBuild.build());  
        };  
        /**  
         * @description 完成进度条  
         * @param {String} title 标题  
         * @param {String} content  内容  
         * @param {String} tickerTips  提示  
         * @param {Number} notifyId id,默认为1000  
         */  
        NotificationCustom.prototype.compProgressNotification = function(title, content, tickerTips,notifyId) {  
            if (this.mNotificationBuild == null ||  
                this.notifyManager == null) {  
                return;  
            }  
            notifyId = (typeof(notifyId)=='number')?notifyId:defaultNotifyId;  
            title = title || '进度条显示完毕';  
            content = content || '进度条显示完毕';  
            tickerTips = tickerTips || '进度提示';  
            this.mNotificationBuild.setContentTitle(title);  
            this.mNotificationBuild.setContentText(content);  
            this.mNotificationBuild.setTicker(tickerTips);  
            this.mNotificationBuild.setProgress(0, 0, false);  
            //默认有声音  
            this.mNotificationBuild.setDefaults(plus.android.importClass("android.app.Notification").DEFAULT_SOUND);  
            this.notifyManager.notify(notifyId, this.mNotificationBuild.build());  
        };  
        /**  
         * @description 清除通知栏信息  
         * @param {Number} notifyId id,默认为1000  
         */  
        NotificationCustom.prototype.clearNotification = function(notifyId) {  
            notifyId = (typeof(notifyId)=='number')?notifyId:defaultNotifyId;  
            if(this.notifyManager){  
                this.notifyManager.cancel(notifyId);  
            }         
        };  
        /**  
         * @description 清除所有通知栏信息  
         */  
        NotificationCustom.prototype.clearAllNotification = function() {  
            if(this.notifyManager){  
                this.notifyManager.cancelAll();  
            }         
        };  
        obj.plusReady(function() {  
            obj.NotificationUtil = new NotificationCustom();  
        });  
    })();  

})(window.NjsPhoneApi = {});

调用方法示例:
显示普通通知:

NjsPhoneApi.NotificationUtil.setNotification('测试标题'+staticI,'测试内容');

显示进度条代码:

function testProgress() {  
        //插件调用  
        NjsPhoneApi.NotificationUtil.setNotification("新版下载", "开始下载");  
        var current = 0;  
        NjsPhoneApi.NotificationUtil.setProgress(current); //插件调用  
        function progress() {  
            setTimeout(function() {  
                current += 1;  
                NjsPhoneApi.NotificationUtil.setProgress(current);  
                if(current>=100){  
                     NjsPhoneApi.NotificationUtil.compProgressNotification("下载完成");  
                }else{  
                    progress();  
                }  
            }, 100);  
        };  
        progress();  
    };  
testProgress();//调用显示进度条

取消单条通知:(传入参数为id,不传采用默认id)

NjsPhoneApi.NotificationUtil.clearNotification();

取消所有通知:

NjsPhoneApi.NotificationUtil.clearAllNotification();

另外: 支持自定义id的通知,也就是说可以通过传入不同的id,同时显示不同的通知

效果图1:
效果图2:
示例源码:鉴于有一些朋友会有各式各样的奇怪错误,所以这里单独写了一个示例,测试了android机型(华为,联想)都是可以正常使用的.
示例源码中采用的是默认id

继续阅读 »

如题,分享一个Notification 进度条插件(android,用js调用原生api实现,直接就可以使用).
参考1: http://ask.dcloud.net.cn/article/155
参考2:http://ask.dcloud.net.cn/question/2464

详细介绍: 最近有一个需求是,android更新资源包时,需要在通知栏里显示下载进度条,于是就搜索了下已有的解决方案
发现并没有现成的解决方案,于是参考了以上两个解决方案,结合了下,实现了直接能调用的js插件.

第一步(分析以上两种方案的缺陷):
第一种:功能上能实现需求,但是使用起来太麻烦,而且也不方便调试(需要离线打包后才能看到效果),
而且,我这里还遇到了一个问题,在 hbuild 6.9.2 中,我明明已经添加了自定义模块权限,但是却一直提示我 ***权限没有添加, 真的是把我弄的吐血了, 所以没办法,只能另谋他路.

第二种:使用起来很方便,但是却没有完全达到功能要求(只显示了普通通知,但没有显示进度条),而且在api <16 的机子上会报错.
于是在这个基础上,结合第一种方法.写了一个 工具类,实现android的通知栏控制(兼容了api11-16的通知显示)

源码:

/**  
 * @description njs实现android原生功能   
 * 1.通知栏消息  
 * @see http://ask.dcloud.net.cn/article/503  
 *   
 * @author dailc  
 * @version 1.0  
 * @time 2016-01-08 08:38:20  
 */  
(function(obj) {  
    var defaultTitle = '通知栏标题';  
    var defaultContent = '通知内容';  
    var defaultTicker = '通知提示';  
    var defaultNotifyId = 1000;  
    var defaultNumber = 1;  
    /**  
     * plusReady  
     * @param {type} callback  
     * @returns {Window}  
     */  
    obj.plusReady = function(callback) {  
        if (window.plus) {  
            setTimeout(function() { //解决callback与plusready事件的执行时机问题(典型案例:showWaiting,closeWaiting)  
                callback();  
            }, 0);  
        } else {  
            document.addEventListener("plusready", function() {  
                callback();  
            }, false);  
        }  
        return this;  
    };  
    /**  
     * @description 比较两个版本大小  
     * 比较版本大小,如果新版本nowVersion大于旧版本OldResourceVersion则返回true,否则返回false  
     */  
    function compareVersion(OldVersion, nowVersion) {  
        if (!OldVersion || !nowVersion || OldVersion == '' || nowVersion == '') {  

            return false;  
        }  
        //第二份参数 是 数组的最大长度  
        var OldVersionA = OldVersion.split(".", 4);  
        var nowVersionA = nowVersion.split(".", 4);  
        for (var i = 0; i < OldVersionA.length && i < nowVersionA.length; i++) {  
            var strOld = OldVersionA[i];  
            var numOld = parseInt(strOld);  
            var strNow = nowVersionA[i];  
            var numNow = parseInt(strNow);  
            //小版本到高版本  
            if (numNow > numOld  
                //||strNow.length>strOld.length  
            ) {  
                return true;  
            } else if (numNow < numOld) {  
                return false;  
            }  
        }  
        //如果是版本  如 1.6 - 1.6.1  
        if (nowVersionA.length > OldVersionA.length && 0 == nowVersion.indexOf(OldVersion)) {  
            return true;  
        }  
    };  
    /**  
     * @description 通过push功能来推送消息  
     */  
    obj.sendNotificationByPush = function() {  
        var options = {  
            cover: false  
        };  
        var str = ": 欢迎使用Html5 Plus创建本地消息!";  
        plus.push.createMessage(str, "LocalMSG", options);  
    };  
    (function() {  
        /**  
         * @constructor 创建通知栏进度条构造函数  
         */  
        function NotificationCustom() {  
            if (plus.os.name != 'Android') {  
                return;  
            }  
            //当前版本号  
            var SystemVersion = plus.os.version;  
            var Context = plus.android.importClass("android.content.Context");  
            var main = plus.android.runtimeMainActivity();  
            var NotificationManager = plus.android.importClass("android.app.NotificationManager");  
            var nm = main.getSystemService(Context.NOTIFICATION_SERVICE)  
                // Notification build 要android api16以上才能使用(4.1.2以上)  
            var Notification = null;  
            if (compareVersion('4.1.1', SystemVersion) == true) {  
                Notification = plus.android.importClass("android.app.Notification");  
            } else {  
                Notification = plus.android.importClass("android.support.v4.app.NotificationCompat");  
            }  
            if (Notification) {  
                this.notifyManager = nm;  
                this.mNotificationBuild = new Notification.Builder(main);  
                //设为true代表常驻状态栏  
                this.mNotificationBuild.setOngoing(false);  
                this.mNotificationBuild.setContentTitle(defaultTitle);  
                this.mNotificationBuild.setContentText(defaultContent);  
                this.mNotificationBuild.setTicker(defaultTicker);  
                //默认的push图标  
                this.mNotificationBuild.setSmallIcon(17301620);  
                //设置默认声音  
                //console.log('默认:'+plus.android.importClass("android.app.Notification").DEFAULT_SOUND);  
                this.mNotificationBuild.setDefaults(plus.android.importClass("android.app.Notification").DEFAULT_SOUND);  
                //this.mNotificationBuild.setNumber(defaultNumber)  
            }  
        };  
        /**  
         * @description 给android通知栏发送通知  
         * @param {String} title 标题  
         * @param {String} content  内容  
         * @param {String} tickerTips  提示  
         * @param {Number} notifyId id,默认为1000  
         */  
        NotificationCustom.prototype.setNotification = function(title, content, tickerTips,notifyId) {  
            if (this.mNotificationBuild == null ||  
                this.notifyManager == null) {  
                return;  
            }  
            notifyId = (typeof(notifyId)=='number')?notifyId:defaultNotifyId;  
            title = title || defaultTitle;  
            content = content || defaultContent;  
            tickerTips = tickerTips || defaultTicker;  
            this.mNotificationBuild.setContentTitle(title);  
            this.mNotificationBuild.setContentText(content);  
            this.mNotificationBuild.setTicker(tickerTips);  
            //默认有声音  
            this.mNotificationBuild.setDefaults(plus.android.importClass("android.app.Notification").DEFAULT_SOUND);  
            this.notifyManager.notify(notifyId, this.mNotificationBuild.build());  
        };  
        /**  
         * @description 设置进度条  
         * @param {Number} progress  
         * @param {String} title 标题  
         * @param {String} content  内容  
         * @param {String} tickerTips  提示  
         * @param {Number} notifyId id,默认为1000  
         */  
        NotificationCustom.prototype.setProgress = function(progress, title, content, tickerTips,notifyId) {  
            if (this.mNotificationBuild == null ||  
                this.notifyManager == null) {  
                return;  
            }  
            notifyId = (typeof(notifyId)=='number')?notifyId:defaultNotifyId;  
            title = title || '正在下载';  
            content = content || '正在下载';  
            tickerTips = tickerTips || '进度提示';  
            //          tickerTips = tickerTips || defaultTicker;  
            this.mNotificationBuild.setContentTitle(title);  
            this.mNotificationBuild.setContentText(content);  
            this.mNotificationBuild.setTicker(tickerTips);  
            //进度条显示时,默认无声音  
            this.mNotificationBuild.setDefaults(0);  
            this.mNotificationBuild.setProgress(100, progress, false);  
            this.notifyManager.notify(notifyId, this.mNotificationBuild.build());  
        };  
        /**  
         * @description 完成进度条  
         * @param {String} title 标题  
         * @param {String} content  内容  
         * @param {String} tickerTips  提示  
         * @param {Number} notifyId id,默认为1000  
         */  
        NotificationCustom.prototype.compProgressNotification = function(title, content, tickerTips,notifyId) {  
            if (this.mNotificationBuild == null ||  
                this.notifyManager == null) {  
                return;  
            }  
            notifyId = (typeof(notifyId)=='number')?notifyId:defaultNotifyId;  
            title = title || '进度条显示完毕';  
            content = content || '进度条显示完毕';  
            tickerTips = tickerTips || '进度提示';  
            this.mNotificationBuild.setContentTitle(title);  
            this.mNotificationBuild.setContentText(content);  
            this.mNotificationBuild.setTicker(tickerTips);  
            this.mNotificationBuild.setProgress(0, 0, false);  
            //默认有声音  
            this.mNotificationBuild.setDefaults(plus.android.importClass("android.app.Notification").DEFAULT_SOUND);  
            this.notifyManager.notify(notifyId, this.mNotificationBuild.build());  
        };  
        /**  
         * @description 清除通知栏信息  
         * @param {Number} notifyId id,默认为1000  
         */  
        NotificationCustom.prototype.clearNotification = function(notifyId) {  
            notifyId = (typeof(notifyId)=='number')?notifyId:defaultNotifyId;  
            if(this.notifyManager){  
                this.notifyManager.cancel(notifyId);  
            }         
        };  
        /**  
         * @description 清除所有通知栏信息  
         */  
        NotificationCustom.prototype.clearAllNotification = function() {  
            if(this.notifyManager){  
                this.notifyManager.cancelAll();  
            }         
        };  
        obj.plusReady(function() {  
            obj.NotificationUtil = new NotificationCustom();  
        });  
    })();  

})(window.NjsPhoneApi = {});

调用方法示例:
显示普通通知:

NjsPhoneApi.NotificationUtil.setNotification('测试标题'+staticI,'测试内容');

显示进度条代码:

function testProgress() {  
        //插件调用  
        NjsPhoneApi.NotificationUtil.setNotification("新版下载", "开始下载");  
        var current = 0;  
        NjsPhoneApi.NotificationUtil.setProgress(current); //插件调用  
        function progress() {  
            setTimeout(function() {  
                current += 1;  
                NjsPhoneApi.NotificationUtil.setProgress(current);  
                if(current>=100){  
                     NjsPhoneApi.NotificationUtil.compProgressNotification("下载完成");  
                }else{  
                    progress();  
                }  
            }, 100);  
        };  
        progress();  
    };  
testProgress();//调用显示进度条

取消单条通知:(传入参数为id,不传采用默认id)

NjsPhoneApi.NotificationUtil.clearNotification();

取消所有通知:

NjsPhoneApi.NotificationUtil.clearAllNotification();

另外: 支持自定义id的通知,也就是说可以通过传入不同的id,同时显示不同的通知

效果图1:
效果图2:
示例源码:鉴于有一些朋友会有各式各样的奇怪错误,所以这里单独写了一个示例,测试了android机型(华为,联想)都是可以正常使用的.
示例源码中采用的是默认id

收起阅读 »

判断手机已安装某APP的方法(Android,Native.js)

原生实现

private boolean isInstalledApp(Context context, String packageName){   
          //获取packagemanager   
          final PackageManager packageManager = context.getPackageManager();  
          //获取所有已安装程序的包信息   
          List< packageInfo> pinfo = packageManager.getInstalledPackages(0);  
          //用于存储所有已安装程序的包名   
          List<String> pName = new ArrayList<String>();  
         //从pinfo中将包名字逐一取出,压入pName list中   
         if(pinfo != null){   
              for(int i = 0; i < pinfo.size(); i++){   
                  String pn = pinfo.get(i).packageName;   
                  pName.add(pn);   
              }   
          }   
          //判断pName中是否有目标程序的包名,有TRUE,没有FALSE   
          return pName.contains(packageName);  
    } 

Native.js

var isInstalledApp = function(pkgname) {  
        plus.android.importClass('java.util.ArrayList');  
        plus.android.importClass('android.content.pm.PackageInfo');  
        plus.android.importClass('android.content.pm.PackageManager');  
        var MainActivity = plus.android.runtimeMainActivity();  
        var PackageManager = MainActivity.getPackageManager();  
        var pinfo = plus.android.invoke(PackageManager, 'getInstalledPackages', 0)  
        if (pinfo != null) {  
            for (i = 0; i < pinfo.size(); i++) {  
                //PackageInfo{4b45699f9d  com.tencent.mobileqq}  
                if (pinfo.get(i).toString().indexOf(pkgname) !== -1) {  
                    return true;  
                }  
            }  
        }  
        return false;  
    }  

## 使用  isInstalledApp('com.tencent.mm')

注意个别手机如华为有权限问题,如果不给权限,无法获取本机应用列表。

方式二:

var getIntentByPackageName = function(pkgname) {  
    plus.android.importClass('android.content.pm.PackageManager');  
    var MainActivity = plus.android.runtimeMainActivity();  
    var PackageManager = MainActivity.getPackageManager();  
    return plus.android.invoke(PackageManager, 'getLaunchIntentForPackage', pkgname);  
}  
var isInstalledApp = function(pkgname) {  
    return getIntentByPackageName(pkgname) != null;  
}  
## 使用  isInstalledApp('com.tencent.mm')
继续阅读 »

原生实现

private boolean isInstalledApp(Context context, String packageName){   
          //获取packagemanager   
          final PackageManager packageManager = context.getPackageManager();  
          //获取所有已安装程序的包信息   
          List< packageInfo> pinfo = packageManager.getInstalledPackages(0);  
          //用于存储所有已安装程序的包名   
          List<String> pName = new ArrayList<String>();  
         //从pinfo中将包名字逐一取出,压入pName list中   
         if(pinfo != null){   
              for(int i = 0; i < pinfo.size(); i++){   
                  String pn = pinfo.get(i).packageName;   
                  pName.add(pn);   
              }   
          }   
          //判断pName中是否有目标程序的包名,有TRUE,没有FALSE   
          return pName.contains(packageName);  
    } 

Native.js

var isInstalledApp = function(pkgname) {  
        plus.android.importClass('java.util.ArrayList');  
        plus.android.importClass('android.content.pm.PackageInfo');  
        plus.android.importClass('android.content.pm.PackageManager');  
        var MainActivity = plus.android.runtimeMainActivity();  
        var PackageManager = MainActivity.getPackageManager();  
        var pinfo = plus.android.invoke(PackageManager, 'getInstalledPackages', 0)  
        if (pinfo != null) {  
            for (i = 0; i < pinfo.size(); i++) {  
                //PackageInfo{4b45699f9d  com.tencent.mobileqq}  
                if (pinfo.get(i).toString().indexOf(pkgname) !== -1) {  
                    return true;  
                }  
            }  
        }  
        return false;  
    }  

## 使用  isInstalledApp('com.tencent.mm')

注意个别手机如华为有权限问题,如果不给权限,无法获取本机应用列表。

方式二:

var getIntentByPackageName = function(pkgname) {  
    plus.android.importClass('android.content.pm.PackageManager');  
    var MainActivity = plus.android.runtimeMainActivity();  
    var PackageManager = MainActivity.getPackageManager();  
    return plus.android.invoke(PackageManager, 'getLaunchIntentForPackage', pkgname);  
}  
var isInstalledApp = function(pkgname) {  
    return getIntentByPackageName(pkgname) != null;  
}  
## 使用  isInstalledApp('com.tencent.mm')
收起阅读 »

HBuilder6.8.x版本后,升级进度不消失的解决办法

升级更新 检查更新 HBuilder

1.关闭HBuilder(或强制终止进程)

  1. 重启HBuilder,等待HBuilder弹出升级提示的消息框(如下图)
  2. 点击立即更新、查看详情、暂不更新均可(请不要点击x关闭此提示框,也不要不点击等待这个提示框消失)
  3. 6.9.1将修复这个问题(但需要后续版本才会生效)
继续阅读 »

1.关闭HBuilder(或强制终止进程)

  1. 重启HBuilder,等待HBuilder弹出升级提示的消息框(如下图)
  2. 点击立即更新、查看详情、暂不更新均可(请不要点击x关闭此提示框,也不要不点击等待这个提示框消失)
  3. 6.9.1将修复这个问题(但需要后续版本才会生效)
收起阅读 »

Mac版HBuilder使用SVN连接https地址报错的解决办法

SVN Mac版 HBuilder

Mac版HBuilder安装svn插件后,连接https的svn地址可能会报

svn: E175002: Connection has been shutdown: javax.net.ssl.SSLProtocolException: handshake alert:  unrecognized_name  
svn: E175002: OPTIONS request failed on '/svn/ifeedback_web'  
    svn: E175002: Connection has been shutdown: javax.net.ssl.SSLProtocolException: handshake alert:  unrecognized_name  
svn: E175002: OPTIONS request failed on '/svn/ifeedback_web'  
    Connection has been shutdown: javax.net.ssl.SSLProtocolException: handshake alert:  unrecognized_name  
    handshake alert:  unrecognized_name

的错误,解决办法如下
打开HBuilder.app/Contents/MacOS/HBuilder.ini文件,在最后添加如下三行代码重启HBuilder即可

-Dsvnkit.http.sslProtocols="SSLv3"   
-Djsse.enableSNIExtension=false  
-Dhudson.spool-svn=true

参考附件HBuilder.ini.zip中的HBuilder.ini(可备份下原来的覆盖本地的)

继续阅读 »

Mac版HBuilder安装svn插件后,连接https的svn地址可能会报

svn: E175002: Connection has been shutdown: javax.net.ssl.SSLProtocolException: handshake alert:  unrecognized_name  
svn: E175002: OPTIONS request failed on '/svn/ifeedback_web'  
    svn: E175002: Connection has been shutdown: javax.net.ssl.SSLProtocolException: handshake alert:  unrecognized_name  
svn: E175002: OPTIONS request failed on '/svn/ifeedback_web'  
    Connection has been shutdown: javax.net.ssl.SSLProtocolException: handshake alert:  unrecognized_name  
    handshake alert:  unrecognized_name

的错误,解决办法如下
打开HBuilder.app/Contents/MacOS/HBuilder.ini文件,在最后添加如下三行代码重启HBuilder即可

-Dsvnkit.http.sslProtocols="SSLv3"   
-Djsse.enableSNIExtension=false  
-Dhudson.spool-svn=true

参考附件HBuilder.ini.zip中的HBuilder.ini(可备份下原来的覆盖本地的)

收起阅读 »

DCloud-BeeCloud Pay 无后端开发的支付服务

beecloud 支付

DCloud-BeeCloud Pay
==============

DCloud和BeeCloud合作的支付业务,与普通的三方支付不同。
它仅需要工程师写前端App的js代码,调用Plus的原生支付接口进行支付宝和微信的原生支付,不需要服务器编写代码,即可收款到开发商自己的微信或支付宝的账户里。
需要注意钱并不流经DCloud或beecloud的服务器,开发商向微信和支付宝申请账户,最终用户支付的钱直接到达开发商在微信或支付宝里申请的账户。

BeeCloud同样支持银联在线支付渠道,银联在线在WAP及流应用环境下同样可用。

体验DEMO的方式:HBuilder 7.0版本后新建的Hello mui项目含有cloud pay模板。

准备工作

注册

创建APP

配置支付参数

test

开始支付

manifest.json配置

模块权限配置
  • 勾选payment模块
SDK配置
  • 需要在plus.payment-支付中配置scheme

    • 支付宝支付
      自定义填写,推荐使用小写字符串,不能填写alipay,AliPay等关键字

    • 微信支付
      固定填写,微信开放平台创建应用的APPID

这些配置都是云打包之后生效,所以测试微信支付,必须云打包之后,在手机上运行,才能正常调起微信客户端支付。否则在数据正常的情况下,调起微信客户端后,会出现异常(只显示一个确定按钮)
真机运行使用的是DCloud公司的支付配置信息,此时付款会付给DCloud。

代码实现

  • 在页面中引入beecloud.js
    ( 在Hello mui里含有本文件)

    <script src="beecloud.js"></script>  
  • 构建支付参数发起支付

<script src="beecloud.js"></script>  
<script type="text/javascript">  
    function beecloudPay(bcChannel) {  
        /*  
         * 构建支付参数  
         *   
         * app_id: BeeCloud控制台上创建的APP的appid,必填   
         * title: 订单标题,32个字节,最长支持16个汉字;必填  
         * total_fee: 支付金额,以分为单位,大于0的整数,必填  
         * bill_no: 订单号,8~32位数字和/或字母组合,确保在商户系统中唯一,必填  
         * optional: 扩展参数,可以传入任意数量的key/value对来补充对业务逻辑的需求;此参数会在webhook回调中返回; 选填  
         * bill_timeout: 订单失效时间,必须为非零正整数,单位为秒,必须大于360。选填   
         */  
        var payData = {  
            app_id: "c37d661d-7e61-49ea-96a5-68c34e83db3b",  
            channel: bcChannel,    
            title: "DCloud",   
            total_fee: 1,   
            bill_no: beecloud.genBillNo(),      
            optional: {'uerId':'beecloud','phone':'4006280728'},    
            bill_timeout: 360   
        };  
        /*  
         *  发起支付  
         *  payData: 支付参数  
         *  cbsuccess: 支付成功回调  
         *  cberror: 支付失败回调  
         */  
        beecloud.payReq(payData, function(result) {  
            mui.alert("----- 支付成功 -----" + str);  
        }, function(e) {  
            mui.alert("----- 支付失败 -----\n" +"错误码:"+ e.code + '\n' + e.message);  
        });  
    }  
</script>

</br>

联系Beecloud

如果您遇到问题,有以下方式可以联系到Beecloud:
① 请致电 40062807281
② 加入我们的开发者交流群:429506653
③ 在我们的FAQ页寻找答案

继续阅读 »

DCloud-BeeCloud Pay
==============

DCloud和BeeCloud合作的支付业务,与普通的三方支付不同。
它仅需要工程师写前端App的js代码,调用Plus的原生支付接口进行支付宝和微信的原生支付,不需要服务器编写代码,即可收款到开发商自己的微信或支付宝的账户里。
需要注意钱并不流经DCloud或beecloud的服务器,开发商向微信和支付宝申请账户,最终用户支付的钱直接到达开发商在微信或支付宝里申请的账户。

BeeCloud同样支持银联在线支付渠道,银联在线在WAP及流应用环境下同样可用。

体验DEMO的方式:HBuilder 7.0版本后新建的Hello mui项目含有cloud pay模板。

准备工作

注册

创建APP

配置支付参数

test

开始支付

manifest.json配置

模块权限配置
  • 勾选payment模块
SDK配置
  • 需要在plus.payment-支付中配置scheme

    • 支付宝支付
      自定义填写,推荐使用小写字符串,不能填写alipay,AliPay等关键字

    • 微信支付
      固定填写,微信开放平台创建应用的APPID

这些配置都是云打包之后生效,所以测试微信支付,必须云打包之后,在手机上运行,才能正常调起微信客户端支付。否则在数据正常的情况下,调起微信客户端后,会出现异常(只显示一个确定按钮)
真机运行使用的是DCloud公司的支付配置信息,此时付款会付给DCloud。

代码实现

  • 在页面中引入beecloud.js
    ( 在Hello mui里含有本文件)

    <script src="beecloud.js"></script>  
  • 构建支付参数发起支付

<script src="beecloud.js"></script>  
<script type="text/javascript">  
    function beecloudPay(bcChannel) {  
        /*  
         * 构建支付参数  
         *   
         * app_id: BeeCloud控制台上创建的APP的appid,必填   
         * title: 订单标题,32个字节,最长支持16个汉字;必填  
         * total_fee: 支付金额,以分为单位,大于0的整数,必填  
         * bill_no: 订单号,8~32位数字和/或字母组合,确保在商户系统中唯一,必填  
         * optional: 扩展参数,可以传入任意数量的key/value对来补充对业务逻辑的需求;此参数会在webhook回调中返回; 选填  
         * bill_timeout: 订单失效时间,必须为非零正整数,单位为秒,必须大于360。选填   
         */  
        var payData = {  
            app_id: "c37d661d-7e61-49ea-96a5-68c34e83db3b",  
            channel: bcChannel,    
            title: "DCloud",   
            total_fee: 1,   
            bill_no: beecloud.genBillNo(),      
            optional: {'uerId':'beecloud','phone':'4006280728'},    
            bill_timeout: 360   
        };  
        /*  
         *  发起支付  
         *  payData: 支付参数  
         *  cbsuccess: 支付成功回调  
         *  cberror: 支付失败回调  
         */  
        beecloud.payReq(payData, function(result) {  
            mui.alert("----- 支付成功 -----" + str);  
        }, function(e) {  
            mui.alert("----- 支付失败 -----\n" +"错误码:"+ e.code + '\n' + e.message);  
        });  
    }  
</script>

</br>

联系Beecloud

如果您遇到问题,有以下方式可以联系到Beecloud:
① 请致电 40062807281
② 加入我们的开发者交流群:429506653
③ 在我们的FAQ页寻找答案

收起阅读 »

微信支付 苹果 只有一个按钮

白屏 微信支付

问题截图(引用至nickkuang同学的问题截图)

帮论坛里面的同学解决问题的时候遇到这个,然后这位同学最后发现是自己的SDK配置里面微信支付和微信分享的APPid配置不相同造成的
换句话说就是微信支付的APPid配置错了,到上图这一步其实微信支付已经走到最后一步了,支付字符串基本没问题了,已经吊起支付了,
但是跟微信app的交互出现了问题,验证失败,导致各种奇葩BUG出现,基本都是appid和签名的问题,另外我又去翻了下微信开放平台的
创建应用,发现苹果的支付校验是通过bundleID来校验的,也就是app打包的包名,如果苹果出现了上图的问题也可以去查下开放平台配置
是否有问题,目前我遇到的问题基本就这些了,希望对大家开发有点帮助吧!

继续阅读 »

问题截图(引用至nickkuang同学的问题截图)

帮论坛里面的同学解决问题的时候遇到这个,然后这位同学最后发现是自己的SDK配置里面微信支付和微信分享的APPid配置不相同造成的
换句话说就是微信支付的APPid配置错了,到上图这一步其实微信支付已经走到最后一步了,支付字符串基本没问题了,已经吊起支付了,
但是跟微信app的交互出现了问题,验证失败,导致各种奇葩BUG出现,基本都是appid和签名的问题,另外我又去翻了下微信开放平台的
创建应用,发现苹果的支付校验是通过bundleID来校验的,也就是app打包的包名,如果苹果出现了上图的问题也可以去查下开放平台配置
是否有问题,目前我遇到的问题基本就这些了,希望对大家开发有点帮助吧!

收起阅读 »

Android下打开手机GPS设置

Native.JS

这几天找打开GPS设置帖子,好像都没有找到,没办法只好自己写了。
手上只有两台安卓设备,一台魅族MX和一台华为,因此只能保证安卓下能用,可能还需要大家佐证。

if(plus.os.name == "Android"){
var context = plus.android.importClass("android.content.Context");
var locationManager=plus.android.importClass("android.location.LocationManager");
var main=plus.android.runtimeMainActivity();
var mainSvr=main.getSystemService(context.LOCATION_SERVICE);
var gpsProvider = mainSvr.isProviderEnabled(locationManager.GPS_PROVIDER);//检查是否开启了GPS
if(!gpsProvider) {
var message = "为了获取您的精准位置,请开启GPS设备。";
var title = "GPS未启用";
var alertCB = function () {
var Intent = plus.android.importClass("android.content.Intent");
var mIntent = new Intent('android.settings.LOCATION_SOURCE_SETTINGS');
main.startActivity(mIntent);//打开GPS设置
}
plus.nativeUI.alert( message, alertCB, title);
}
}

关于iOS下的gps设置,如果有朋友做出来了,希望能分享下,本人为这个已经愁白了头了!

继续阅读 »

这几天找打开GPS设置帖子,好像都没有找到,没办法只好自己写了。
手上只有两台安卓设备,一台魅族MX和一台华为,因此只能保证安卓下能用,可能还需要大家佐证。

if(plus.os.name == "Android"){
var context = plus.android.importClass("android.content.Context");
var locationManager=plus.android.importClass("android.location.LocationManager");
var main=plus.android.runtimeMainActivity();
var mainSvr=main.getSystemService(context.LOCATION_SERVICE);
var gpsProvider = mainSvr.isProviderEnabled(locationManager.GPS_PROVIDER);//检查是否开启了GPS
if(!gpsProvider) {
var message = "为了获取您的精准位置,请开启GPS设备。";
var title = "GPS未启用";
var alertCB = function () {
var Intent = plus.android.importClass("android.content.Intent");
var mIntent = new Intent('android.settings.LOCATION_SOURCE_SETTINGS');
main.startActivity(mIntent);//打开GPS设置
}
plus.nativeUI.alert( message, alertCB, title);
}
}

关于iOS下的gps设置,如果有朋友做出来了,希望能分享下,本人为这个已经愁白了头了!

收起阅读 »

DCloud流应用培训沙龙完满结束:ppt、视频、照片全放出

HBuilder 流应用

  DCloud流应用培训沙龙昨天在北京大钟寺华杰大厦清创空间圆满结束,现场的位置几乎全部坐满,有的小伙伴甚至从大连、杭州、天津赶过来,让我们的三位讲师非常感动。另外,HTML5中国产业联盟的相关联盟成员Testin云测、微明互动、东翌互联学院、以及天津千行时线科技有限公司等小伙伴也到现场给予了我们的支撑。

    下面是活动部分照片:

  

  王老师正在讲流应用,流应用有很多优势。。。。。。

  

  5+App的讲师正在演讲中。。。。。。

  

  崔老师正在讲App的高级优化技巧。。。。。。

  

  小伙伴们听的很认真,很安静,果然是一群技术发烧友啊。。。。。。还有微吼直播的同学给我们做现场直播,最后那个架个手机的同学就是。

  

  活动中间,小伙伴们提问很积极。。。。。。

  

  沙龙期间,天津卫视创业频道的摄影师和记者,对DCloud创始人王总进行了采访,同时天津千行时线的李总和王总也进行了技术交流。

  最后,在一场晚宴中,我们愉快的结束了昨天下午的沙龙培训,下面是晚宴的小伙伴合影!

  

  下面是干货,请下载:

  1.活动全程视频观看地址: http://e.vhall.com/944470274

  2.讲师演讲的PPT,欢迎大家下载!

  王老师演讲PPT:流应用介绍for 开发者培训1229

  颜老师演讲PPT:5+APP优化技巧

   崔老师的演讲PPT:App开发高级优化技巧、多端发布、流应用开发  
继续阅读 »

  DCloud流应用培训沙龙昨天在北京大钟寺华杰大厦清创空间圆满结束,现场的位置几乎全部坐满,有的小伙伴甚至从大连、杭州、天津赶过来,让我们的三位讲师非常感动。另外,HTML5中国产业联盟的相关联盟成员Testin云测、微明互动、东翌互联学院、以及天津千行时线科技有限公司等小伙伴也到现场给予了我们的支撑。

    下面是活动部分照片:

  

  王老师正在讲流应用,流应用有很多优势。。。。。。

  

  5+App的讲师正在演讲中。。。。。。

  

  崔老师正在讲App的高级优化技巧。。。。。。

  

  小伙伴们听的很认真,很安静,果然是一群技术发烧友啊。。。。。。还有微吼直播的同学给我们做现场直播,最后那个架个手机的同学就是。

  

  活动中间,小伙伴们提问很积极。。。。。。

  

  沙龙期间,天津卫视创业频道的摄影师和记者,对DCloud创始人王总进行了采访,同时天津千行时线的李总和王总也进行了技术交流。

  最后,在一场晚宴中,我们愉快的结束了昨天下午的沙龙培训,下面是晚宴的小伙伴合影!

  

  下面是干货,请下载:

  1.活动全程视频观看地址: http://e.vhall.com/944470274

  2.讲师演讲的PPT,欢迎大家下载!

  王老师演讲PPT:流应用介绍for 开发者培训1229

  颜老师演讲PPT:5+APP优化技巧

   崔老师的演讲PPT:App开发高级优化技巧、多端发布、流应用开发  
收起阅读 »

js原生混淆功能体验

加密 5+App开发 HTML5+ HBuilder

js原生混淆体验包
下载地址链接:
mac : http://pan.baidu.com/s/1slTBRBJ
win : http://pan.baidu.com/s/1kUGaHYR
或:
http://pan.baidu.com/s/1sjSxQVz 密码:we6t
说明:
1.提供js原生混淆功能

  1. js原生混淆不支持4.0以下的Android设备(不含4.0)
    3.本包为每日更新包,可能包含不稳定更新内容。每日最新整包地址
    windows:http://update.dcloud.net.cn/alpha/HBuilder.windows@当日时间戳(如20151230).zip
    mac:http://update.dcloud.net.cn/alpha/HBuilder.macosx_64@当日时间戳(如20151230).tar.gz
    js原生混淆功能使用如下
    1.菜单"发行"-“制作原生安装包”界面,勾选js原生混淆

    2.点击“js原生混淆配置”,配置需要混淆的js文件

    3.提交打包
继续阅读 »

js原生混淆体验包
下载地址链接:
mac : http://pan.baidu.com/s/1slTBRBJ
win : http://pan.baidu.com/s/1kUGaHYR
或:
http://pan.baidu.com/s/1sjSxQVz 密码:we6t
说明:
1.提供js原生混淆功能

  1. js原生混淆不支持4.0以下的Android设备(不含4.0)
    3.本包为每日更新包,可能包含不稳定更新内容。每日最新整包地址
    windows:http://update.dcloud.net.cn/alpha/HBuilder.windows@当日时间戳(如20151230).zip
    mac:http://update.dcloud.net.cn/alpha/HBuilder.macosx_64@当日时间戳(如20151230).tar.gz
    js原生混淆功能使用如下
    1.菜单"发行"-“制作原生安装包”界面,勾选js原生混淆

    2.点击“js原生混淆配置”,配置需要混淆的js文件

    3.提交打包
收起阅读 »

海马玩 0.8.7 与HBuilder连接设置

调试 模拟器 海马玩模拟器

海马玩版本0.8.7 ,HBuilder 6.8.2.201512111923,
1、打开海马玩和HBuilder

2、下载海马玩端口检测工具
链接:http://pan.baidu.com/s/1nuqlQHV 密码:pr9t
打开海马玩检测工具CheckPort.exe
点击check,找到端口为26944

3、打开cmd 指定到 \HBuilder\tools下
输入 adb connect 127.0.0.1:26944 回车 提示 connected to 127.0.0.1:26944

也可以在HBuilder 软件 工具》选项》HBuilder 把端口号改为26944(用这种方法好像比较稳定,都试试看)

4、打开HBuilder调试重试刷新一下 就有了

继续阅读 »

海马玩版本0.8.7 ,HBuilder 6.8.2.201512111923,
1、打开海马玩和HBuilder

2、下载海马玩端口检测工具
链接:http://pan.baidu.com/s/1nuqlQHV 密码:pr9t
打开海马玩检测工具CheckPort.exe
点击check,找到端口为26944

3、打开cmd 指定到 \HBuilder\tools下
输入 adb connect 127.0.0.1:26944 回车 提示 connected to 127.0.0.1:26944

也可以在HBuilder 软件 工具》选项》HBuilder 把端口号改为26944(用这种方法好像比较稳定,都试试看)

4、打开HBuilder调试重试刷新一下 就有了

收起阅读 »