HBuilderX

HBuilderX

极客开发工具
uni-app

uni-app

开发一次,多端覆盖
uniCloud

uniCloud

云开发平台
HTML5+

HTML5+

增强HTML5的功能体验
MUI

MUI

上万Star的前端框架

关于HB的一些功能建议

动画

以下属于个人之见,勿见笑,望大家指教。
建议一、双屏或多屏显示器的布局
周遭平时参与工作的开发平台硬件大多为多屏幕,希望对多屏幕的布局有一些针对性的设计。比如我可以在三个屏幕分别布放资源管理器、代码工作区、WEB显示区,这样来扩展显示面积,显示更多信息更加方便快捷的操作。
建议二、强化CSS编辑器,比如加入可视化样式编辑(如DW类似功能),加入一些常见模板(去A标签样式之类的)。
建议三、整合一些代码或者JS库之类的来实现可视化或快捷的动画编辑让网页达到一些想要的效果,常用的基本的就够用(移动、淡入淡出、翻页之类的)
感谢HB开发人员 你们辛苦了!一万个赞!

继续阅读 »

以下属于个人之见,勿见笑,望大家指教。
建议一、双屏或多屏显示器的布局
周遭平时参与工作的开发平台硬件大多为多屏幕,希望对多屏幕的布局有一些针对性的设计。比如我可以在三个屏幕分别布放资源管理器、代码工作区、WEB显示区,这样来扩展显示面积,显示更多信息更加方便快捷的操作。
建议二、强化CSS编辑器,比如加入可视化样式编辑(如DW类似功能),加入一些常见模板(去A标签样式之类的)。
建议三、整合一些代码或者JS库之类的来实现可视化或快捷的动画编辑让网页达到一些想要的效果,常用的基本的就够用(移动、淡入淡出、翻页之类的)
感谢HB开发人员 你们辛苦了!一万个赞!

收起阅读 »

安卓源码总体结构(2)基础知识汇总



packages/ |– apps (各种应用程序,如联系人、浏览器等)  
 |– experimental (一些实验性的项目,如错误报告)   
|– inputmethods (输入法相关)  
 |– providers (各种数据源实现,如联系人数据、媒体库等信息)   
|– wallpapers (各种壁纸程序) Android Framework功能介绍   

![](http://static.oschina.net/uploads/img/201508/25102205_GB6o.gif)  
android.app :提供**的程序模型和基本的运行环境。  
 android.content :包含对各种设备上的数据进行访问和发布。   
android.database :通过内容提供者浏览和操作数据库。   
android.graphics :底层图形库,包含画布、点、矩形等,可以将其直接绘制到屏幕上。  
 android.location :定位和相关服务的类。  
 android.media :提供一些类管理多种音频、视频的媒体接口。  
 android.net :提供帮助网络访问的类,超过通常的 java.net.* 接口。  
 android.os :提供了系统服务、消息传输和 IPC 机制。   
android.opengl :提供 OpenGL 的工具。   
android.provider :提供访问 Android 内容提供者的类。   
android.telephony :提供与拨打电话相关的 API 交互。  
 android.view :提供基础的用户界面接口框架。  
 android.util :涉及工具性的方法,例如时间日期的操作。  
 android.webkit :默认浏览器操作接口。  
 android.widget :包含各种 UI 元素(大部分是可见的)在应用程序的布局中使用 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~   
build/ |– buildspec.mk.default |– cleanspec.mk |– core (各种以mk为结尾的文件,它门是编译所需要的Makefile)  
 |– envsetup.sh |– libs |– target (包含board和product两个目录,为目标所需要文件)   
|– tools (编译过程中主机所需要的工具,一些需要经过编译生成) 其中,core中的Makefile是整个Android编译所需要的真正的Makefile,它被顶层目录的Makefile引用  

知识点小结,DEX (class.dex) 文件是Android系统中可以在Dalvik虚拟机上直接运行的文件格式。  
Java源码通过ADT编译成smali语言这是一个优化的过程,  
相对 于.class文件它体积小、运行效率高、被编译后可读性低;smali再到class.dex本身就是一个加壳保护的过程。  
 DEX文件如果未做好保护, 黑客通过反编译可让源码完全暴露,可利用阅读源码来找到APP的设计流程,  
通过对程序流程的了解将很容易对程序进行盗版、恶意篡改、恶意代码注入等危险行 为。  
在此特别感谢爱加密提供的加密服务给我应用加固提供了保护。  
[](http://www.ijiami.cn/AppProtect)  
继续阅读 »


packages/ |– apps (各种应用程序,如联系人、浏览器等)  
 |– experimental (一些实验性的项目,如错误报告)   
|– inputmethods (输入法相关)  
 |– providers (各种数据源实现,如联系人数据、媒体库等信息)   
|– wallpapers (各种壁纸程序) Android Framework功能介绍   

![](http://static.oschina.net/uploads/img/201508/25102205_GB6o.gif)  
android.app :提供**的程序模型和基本的运行环境。  
 android.content :包含对各种设备上的数据进行访问和发布。   
android.database :通过内容提供者浏览和操作数据库。   
android.graphics :底层图形库,包含画布、点、矩形等,可以将其直接绘制到屏幕上。  
 android.location :定位和相关服务的类。  
 android.media :提供一些类管理多种音频、视频的媒体接口。  
 android.net :提供帮助网络访问的类,超过通常的 java.net.* 接口。  
 android.os :提供了系统服务、消息传输和 IPC 机制。   
android.opengl :提供 OpenGL 的工具。   
android.provider :提供访问 Android 内容提供者的类。   
android.telephony :提供与拨打电话相关的 API 交互。  
 android.view :提供基础的用户界面接口框架。  
 android.util :涉及工具性的方法,例如时间日期的操作。  
 android.webkit :默认浏览器操作接口。  
 android.widget :包含各种 UI 元素(大部分是可见的)在应用程序的布局中使用 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~   
build/ |– buildspec.mk.default |– cleanspec.mk |– core (各种以mk为结尾的文件,它门是编译所需要的Makefile)  
 |– envsetup.sh |– libs |– target (包含board和product两个目录,为目标所需要文件)   
|– tools (编译过程中主机所需要的工具,一些需要经过编译生成) 其中,core中的Makefile是整个Android编译所需要的真正的Makefile,它被顶层目录的Makefile引用  

知识点小结,DEX (class.dex) 文件是Android系统中可以在Dalvik虚拟机上直接运行的文件格式。  
Java源码通过ADT编译成smali语言这是一个优化的过程,  
相对 于.class文件它体积小、运行效率高、被编译后可读性低;smali再到class.dex本身就是一个加壳保护的过程。  
 DEX文件如果未做好保护, 黑客通过反编译可让源码完全暴露,可利用阅读源码来找到APP的设计流程,  
通过对程序流程的了解将很容易对程序进行盗版、恶意篡改、恶意代码注入等危险行 为。  
在此特别感谢爱加密提供的加密服务给我应用加固提供了保护。  
[](http://www.ijiami.cn/AppProtect)  
收起阅读 »

分享一个IM源码,基于Mui + Leancloud +个推

个推 IM

最近研究了一下即时通讯模块,做了一个IM模板。
比较了融云等三方IM模块,最终选择了Leancloud,主要是灵活强大,可以任意定制。
有一个棘手的问题是Android 4.4以下不支持WebSocket,不想用长轮询的方式workaround。
于是放弃了Leancloud的推送模块,把官方的个推集成进来替换推送模块。

发布V1.0.1版本,目前仅支持发送文本,还在不断完善中。

安卓APK安装包

继续阅读 »

最近研究了一下即时通讯模块,做了一个IM模板。
比较了融云等三方IM模块,最终选择了Leancloud,主要是灵活强大,可以任意定制。
有一个棘手的问题是Android 4.4以下不支持WebSocket,不想用长轮询的方式workaround。
于是放弃了Leancloud的推送模块,把官方的个推集成进来替换推送模块。

发布V1.0.1版本,目前仅支持发送文本,还在不断完善中。

安卓APK安装包

收起阅读 »

使用ajax能获取数据? 已经测试过mui、jq、js

ajax 问题已解决
mui.init();  
        mui.plusReady(function(){  
        console.log('beginTest');  
        muitest();  
        jqtest();  
        JStest();  
        });  

        function muitest(){  
                console.log('mui test begin');  
            mui.ajax('http://192.168.220.48/api/item',{  
                type:'get',  
                success:function(data){  
                    console.log('mui test success');  
                    console.log(data);  
                },  
                error:function(xhr,typestr,e){  
                    console.log('mui test error');  
                    console.log('mui test error: type='+typestr);  
                }  
            });  
            console.log('mui test end ');  
        }  
        function jqtest(){  
            console.log('jq test begin');  
            $.ajax({  
                url:'http://192.168.220.48/api/item',  
                type:'get',  
                success:function(data){  
                    console.log('jq test success');  
                    console.log(data);  
                },  
                error:function(xhr,state,e){  
                    console.log('jq test error');  
                    console.log('jq test error: state='+state);  
                }  
            });  
            console.log('jq test end ');  
        }  
        function JStest(){  
            console.log('js test begin');  
            var xhr=new XMLHttpRequest();  
            console.log('js test XMLHttpRequest init end');  
            xhr.onreadystatechange=function()  
                {  
                    console.log('js test stateChanged    '+xhr.readyState+'          '+xhr.status);  
                    if (xhr.readyState==4 && xhr.status==200)  
                    {  
                        console.log('success     '+xhr.responseText);  
                    }  
                }  
                console.log('js test set event end');  
                xhr.open('GET','http://192.168.220.48/api/item',true);  
                console.log('js test open end');  
                xhr.send();  
                console.log('js test send end');  
                console.log('js test end ');  
        }

[LOG] : beginTest
[LOG] : mui test begin
[LOG] : mui test end
[LOG] : jq test begin
[LOG] : jq test end
[LOG] : js test begin
[LOG] : js test XMLHttpRequest init end
[LOG] : js test set event end
[LOG] : js test stateChanged 1 0
[LOG] : js test open end
[LOG] : js test send end
[LOG] : js test end
--------等待超时后
[LOG] : mui test error
[LOG] : mui test error: type=abort
[LOG] : js test stateChanged 4 0

疑惑点
1/为什么onreadystatechange 事件只触发了两次
2/为什么第二次触发时 readyState=4 而status却是0

继续阅读 »
mui.init();  
        mui.plusReady(function(){  
        console.log('beginTest');  
        muitest();  
        jqtest();  
        JStest();  
        });  

        function muitest(){  
                console.log('mui test begin');  
            mui.ajax('http://192.168.220.48/api/item',{  
                type:'get',  
                success:function(data){  
                    console.log('mui test success');  
                    console.log(data);  
                },  
                error:function(xhr,typestr,e){  
                    console.log('mui test error');  
                    console.log('mui test error: type='+typestr);  
                }  
            });  
            console.log('mui test end ');  
        }  
        function jqtest(){  
            console.log('jq test begin');  
            $.ajax({  
                url:'http://192.168.220.48/api/item',  
                type:'get',  
                success:function(data){  
                    console.log('jq test success');  
                    console.log(data);  
                },  
                error:function(xhr,state,e){  
                    console.log('jq test error');  
                    console.log('jq test error: state='+state);  
                }  
            });  
            console.log('jq test end ');  
        }  
        function JStest(){  
            console.log('js test begin');  
            var xhr=new XMLHttpRequest();  
            console.log('js test XMLHttpRequest init end');  
            xhr.onreadystatechange=function()  
                {  
                    console.log('js test stateChanged    '+xhr.readyState+'          '+xhr.status);  
                    if (xhr.readyState==4 && xhr.status==200)  
                    {  
                        console.log('success     '+xhr.responseText);  
                    }  
                }  
                console.log('js test set event end');  
                xhr.open('GET','http://192.168.220.48/api/item',true);  
                console.log('js test open end');  
                xhr.send();  
                console.log('js test send end');  
                console.log('js test end ');  
        }

[LOG] : beginTest
[LOG] : mui test begin
[LOG] : mui test end
[LOG] : jq test begin
[LOG] : jq test end
[LOG] : js test begin
[LOG] : js test XMLHttpRequest init end
[LOG] : js test set event end
[LOG] : js test stateChanged 1 0
[LOG] : js test open end
[LOG] : js test send end
[LOG] : js test end
--------等待超时后
[LOG] : mui test error
[LOG] : mui test error: type=abort
[LOG] : js test stateChanged 4 0

疑惑点
1/为什么onreadystatechange 事件只触发了两次
2/为什么第二次触发时 readyState=4 而status却是0

收起阅读 »

网页中调起app并传递参数

Android

最近因为项目需要 要在网页中调起app并传递参数 ios请参考http://ask.dcloud.net.cn/article/64 Android官方并没有提示 但是我在本地打包的时候发现官方有配置 : <data android:scheme="hbuilder" /> 所以在网页中通过: <a class="button-download" href="hbuilder://你的参数"><span>启动app</span></a> 就可以启动app 在app中通过:mui.alert(plus.runtime.arguments,"参数","确定",function(){}); 获取 我折腾一早上 希望对大家有用

继续阅读 »

最近因为项目需要 要在网页中调起app并传递参数 ios请参考http://ask.dcloud.net.cn/article/64 Android官方并没有提示 但是我在本地打包的时候发现官方有配置 : <data android:scheme="hbuilder" /> 所以在网页中通过: <a class="button-download" href="hbuilder://你的参数"><span>启动app</span></a> 就可以启动app 在app中通过:mui.alert(plus.runtime.arguments,"参数","确定",function(){}); 获取 我折腾一早上 希望对大家有用

收起阅读 »

关于HBuilder6.3.1 插件安装找不到less插件的解决办法

插件 HBuilder less

由于我们的失误,导致less等插件在插件安装列表中看不到,如果需要这些插件,可按如下步骤进行安装
1.依次点击工具-插件安装-手动安装eclipse插件如下图


2.在插件地址中选择Hbuilder Update Plugins,勾掉group item by category,选择Less pro Compile Feature如下图

3.点击下一步进行安装,安装完毕后重启即可

继续阅读 »

由于我们的失误,导致less等插件在插件安装列表中看不到,如果需要这些插件,可按如下步骤进行安装
1.依次点击工具-插件安装-手动安装eclipse插件如下图


2.在插件地址中选择Hbuilder Update Plugins,勾掉group item by category,选择Less pro Compile Feature如下图

3.点击下一步进行安装,安装完毕后重启即可

收起阅读 »

iOS离线打包-第三方登录插件配置

App离线打包

目前登录插件支持新浪微博登录、QQ登录、微信登录
登录插件首先需要到各开放平台申请帐号,申请查看该文档
注: Linker Flags、framework等添加方法参考该文档

新浪登录插件配置

1.添加以下Linker Flags: -llibOauth、-lSinaWBOauth、-lWeiboSDK
2.添加下列文件:WeiboSDK.bundle
3.打开info.plist,找到sinweibo项,填入自己帐号的信息,如果没有该项,按照图中的格式创建


4.找到URL types ,打开URL identifier为com.weibo的项目,修改item0值为wb[这个是你的appkey] ,如果没有该项按照图中的格式创建

5.iOS9.0以上版本需要在info.plist增加以下配置

6.UIApplicationDelegate实现类中增加下列实现

- (BOOL)application:(UIApplication *)application  
            openURL:(NSURL *)url  
  sourceApplication:(NSString *)sourceApplication  
         annotation:(id)annotation {  
   [PDRCore handleSysEvent:PDRCoreSysEventOpenURL withObject:url];  
    return YES;  
}  

- (BOOL)application:(UIApplication *)application handleOpenURL:(NSURL *)url  
{  
    [PDRCore handleSysEvent:PDRCoreSysEventOpenURL withObject:url];  
    return YES;  
}

QQ登录插件配置

1.添加以下Linker Flags: -llibOauth、-lQQOauth
2.添加以下framwork: TencentOpenAPI.framework
3.添加下列文件: TencentOpenApi_IOS_Bundle.bundle
4.找到URL types,打开URL identifier为tencentopenapi的项目, 修改item0值为tencent[这个是你的appkey] ,如果没有该项按照图中的格式创建


5.iOS9.0以上版本需要在info.plist增加以下配置

或者直接拷贝以下内容:
<key>LSApplicationQueriesSchemes</key>
<array>
<string>mqq</string>
<string>mqqapi</string>
<string>mqzone</string>
<string>wtloginmqq2</string>
<string>mqqopensdkapiV3</string>
<string>mqqwpa</string>
<string>mqqopensdkapiV2</string>
<string>mqqOpensdkSSoLogin</string>
</array>
6.UIApplicationDelegate实现类中增加下列实现

- (BOOL)application:(UIApplication *)application  
            openURL:(NSURL *)url  
  sourceApplication:(NSString *)sourceApplication  
         annotation:(id)annotation {  
   [PDRCore handleSysEvent:PDRCoreSysEventOpenURL withObject:url];  
    return YES;  
}  

- (BOOL)application:(UIApplication *)application handleOpenURL:(NSURL *)url  
{  
    [PDRCore handleSysEvent:PDRCoreSysEventOpenURL withObject:url];  
    return YES;  
}

微信登录插件配置

1.添加以下Linker Flags: -llibOauth、 -lWXOauth、-lWeChatSDK
2.添加以下framwork: Social.framework、Accounts.framework
3.找到URL types ,打开URL identifier为weixin的项目,修改item0值为wx[这个是你的appid] ,这个应该和下步weixinaouth中appid一致,如果没有该项按照图中的格式创建


4.打开info.plist,找到weixinoauth项,填入自己帐号的信息,如果没有该项,按照图中的格式创建

5.iOS9.0以上版本需要在info.plist增加以下配置

6.UIApplicationDelegate实现类中增加下列实现

- (BOOL)application:(UIApplication *)application  
            openURL:(NSURL *)url  
  sourceApplication:(NSString *)sourceApplication  
         annotation:(id)annotation {  
   [PDRCore handleSysEvent:PDRCoreSysEventOpenURL withObject:url];  
    return YES;  
}  

- (BOOL)application:(UIApplication *)application handleOpenURL:(NSURL *)url  
{  
    [PDRCore handleSysEvent:PDRCoreSysEventOpenURL withObject:url];  
    return YES;  
}

<a id="ulink"/>
7.HBuilderX2.3.4+版本需要配置 Universal Link
一 .启用通用链接请参考:https://ask.dcloud.net.cn/article/36393#unilink
二 .在info.plist root 节点添加UniversalLinks项,值和微信开放平台配置的一致,参考如下:


查看工程里的AppDelegate.m文件里是否有下面的方法:

//@Summary:通用链接
-(BOOL)application:(UIApplication )application continueUserActivity:(NSUserActivity )userActivity restorationHandler:(void(^)(NSArray<id<UIUserActivityRestoring>> * __nullable restorableObjects))restorationHandler {
[PDRCore handleSysEvent:PDRCoreSysEventContinueUserActivity withObject:userActivity];
restorationHandler(nil);
return YES;
}

苹果登录插件配置

点击查看

继续阅读 »

目前登录插件支持新浪微博登录、QQ登录、微信登录
登录插件首先需要到各开放平台申请帐号,申请查看该文档
注: Linker Flags、framework等添加方法参考该文档

新浪登录插件配置

1.添加以下Linker Flags: -llibOauth、-lSinaWBOauth、-lWeiboSDK
2.添加下列文件:WeiboSDK.bundle
3.打开info.plist,找到sinweibo项,填入自己帐号的信息,如果没有该项,按照图中的格式创建


4.找到URL types ,打开URL identifier为com.weibo的项目,修改item0值为wb[这个是你的appkey] ,如果没有该项按照图中的格式创建

5.iOS9.0以上版本需要在info.plist增加以下配置

6.UIApplicationDelegate实现类中增加下列实现

- (BOOL)application:(UIApplication *)application  
            openURL:(NSURL *)url  
  sourceApplication:(NSString *)sourceApplication  
         annotation:(id)annotation {  
   [PDRCore handleSysEvent:PDRCoreSysEventOpenURL withObject:url];  
    return YES;  
}  

- (BOOL)application:(UIApplication *)application handleOpenURL:(NSURL *)url  
{  
    [PDRCore handleSysEvent:PDRCoreSysEventOpenURL withObject:url];  
    return YES;  
}

QQ登录插件配置

1.添加以下Linker Flags: -llibOauth、-lQQOauth
2.添加以下framwork: TencentOpenAPI.framework
3.添加下列文件: TencentOpenApi_IOS_Bundle.bundle
4.找到URL types,打开URL identifier为tencentopenapi的项目, 修改item0值为tencent[这个是你的appkey] ,如果没有该项按照图中的格式创建


5.iOS9.0以上版本需要在info.plist增加以下配置

或者直接拷贝以下内容:
<key>LSApplicationQueriesSchemes</key>
<array>
<string>mqq</string>
<string>mqqapi</string>
<string>mqzone</string>
<string>wtloginmqq2</string>
<string>mqqopensdkapiV3</string>
<string>mqqwpa</string>
<string>mqqopensdkapiV2</string>
<string>mqqOpensdkSSoLogin</string>
</array>
6.UIApplicationDelegate实现类中增加下列实现

- (BOOL)application:(UIApplication *)application  
            openURL:(NSURL *)url  
  sourceApplication:(NSString *)sourceApplication  
         annotation:(id)annotation {  
   [PDRCore handleSysEvent:PDRCoreSysEventOpenURL withObject:url];  
    return YES;  
}  

- (BOOL)application:(UIApplication *)application handleOpenURL:(NSURL *)url  
{  
    [PDRCore handleSysEvent:PDRCoreSysEventOpenURL withObject:url];  
    return YES;  
}

微信登录插件配置

1.添加以下Linker Flags: -llibOauth、 -lWXOauth、-lWeChatSDK
2.添加以下framwork: Social.framework、Accounts.framework
3.找到URL types ,打开URL identifier为weixin的项目,修改item0值为wx[这个是你的appid] ,这个应该和下步weixinaouth中appid一致,如果没有该项按照图中的格式创建


4.打开info.plist,找到weixinoauth项,填入自己帐号的信息,如果没有该项,按照图中的格式创建

5.iOS9.0以上版本需要在info.plist增加以下配置

6.UIApplicationDelegate实现类中增加下列实现

- (BOOL)application:(UIApplication *)application  
            openURL:(NSURL *)url  
  sourceApplication:(NSString *)sourceApplication  
         annotation:(id)annotation {  
   [PDRCore handleSysEvent:PDRCoreSysEventOpenURL withObject:url];  
    return YES;  
}  

- (BOOL)application:(UIApplication *)application handleOpenURL:(NSURL *)url  
{  
    [PDRCore handleSysEvent:PDRCoreSysEventOpenURL withObject:url];  
    return YES;  
}

<a id="ulink"/>
7.HBuilderX2.3.4+版本需要配置 Universal Link
一 .启用通用链接请参考:https://ask.dcloud.net.cn/article/36393#unilink
二 .在info.plist root 节点添加UniversalLinks项,值和微信开放平台配置的一致,参考如下:


查看工程里的AppDelegate.m文件里是否有下面的方法:

//@Summary:通用链接
-(BOOL)application:(UIApplication )application continueUserActivity:(NSUserActivity )userActivity restorationHandler:(void(^)(NSArray<id<UIUserActivityRestoring>> * __nullable restorableObjects))restorationHandler {
[PDRCore handleSysEvent:PDRCoreSysEventContinueUserActivity withObject:userActivity];
restorationHandler(nil);
return YES;
}

苹果登录插件配置

点击查看

收起阅读 »

百度地图密匙申请

百度密匙申请
一、生成keystore
1.F:\Java\bin\keytool.exe配置到path里面(注:这里的路径要用自己的)。也可以cd到java\bin目录下;

  1. 生成keystore的命令
    keytool -genkey -alias test.keystore -keyalg RSA -validity 20000 -keystore test.keystore
    下面是我的命令:
    /***/

/*/
keytool -list -v -keystore debug.keystore
二、获取sha1值
命令:
keytool -list -v -keystore test.keystore
下面是我的命令了
/***
/

/****/
我们需要的是这一段
SHA1: D0:84:C4:68:86:F3:E6:02:9F:DF:C4:0B:56:31:60:C0:01:4D:3D:B3

三。在线打包方面如下图

包名按照规范定义这里报名很重要要记住 如:com.lipin
证书别名的话上面获取sha1值的时候已经有了 我的是test.keystore 其实就是文件名
密码:就是生成keystore的时候这只的密码
证书文件的话选中生成的那个证书文件就可以了

四、百度方面的配置
1.有一个百度帐号

  1. 登录到http://developer.baidu.com/map/
  2. 然后选择右上角的API控制台。
  3. 创建应用我就不说了
  4. 然后安全码就是我们的 SHA1 + 包名;
  5. 我的是这样的:D0:84:C4:68:86:F3:E6:02:9F:DF:C4:0B:56:31:60:C0:01:4D:3D:B3;com.lipin
  6. 然后设置完成应用就不会有密匙不匹配的问题出现了。

谢谢大家
alongSefl
2015年8月15日 23:49:42

继续阅读 »

百度密匙申请
一、生成keystore
1.F:\Java\bin\keytool.exe配置到path里面(注:这里的路径要用自己的)。也可以cd到java\bin目录下;

  1. 生成keystore的命令
    keytool -genkey -alias test.keystore -keyalg RSA -validity 20000 -keystore test.keystore
    下面是我的命令:
    /***/

/*/
keytool -list -v -keystore debug.keystore
二、获取sha1值
命令:
keytool -list -v -keystore test.keystore
下面是我的命令了
/***
/

/****/
我们需要的是这一段
SHA1: D0:84:C4:68:86:F3:E6:02:9F:DF:C4:0B:56:31:60:C0:01:4D:3D:B3

三。在线打包方面如下图

包名按照规范定义这里报名很重要要记住 如:com.lipin
证书别名的话上面获取sha1值的时候已经有了 我的是test.keystore 其实就是文件名
密码:就是生成keystore的时候这只的密码
证书文件的话选中生成的那个证书文件就可以了

四、百度方面的配置
1.有一个百度帐号

  1. 登录到http://developer.baidu.com/map/
  2. 然后选择右上角的API控制台。
  3. 创建应用我就不说了
  4. 然后安全码就是我们的 SHA1 + 包名;
  5. 我的是这样的:D0:84:C4:68:86:F3:E6:02:9F:DF:C4:0B:56:31:60:C0:01:4D:3D:B3;com.lipin
  6. 然后设置完成应用就不会有密匙不匹配的问题出现了。

谢谢大家
alongSefl
2015年8月15日 23:49:42

收起阅读 »

指昂平板 指纹识别接口

技术分享 5 SDK

基于厂家提供的例子 android060demo.rar

// FingerPrintFeature.java      
//依赖 demo 的 andriod060.java 和 za_finger.java;引入库 libandroid_060.so;把demo中的权限,加入项目  
//另 closeDevice方法 调用时发现有问题并没有调用,只open然后读取指纹发现没有问题  

package com.renhe.za.fingerPrintApi;  
import io.dcloud.DHInterface.IWebview;  
import io.dcloud.DHInterface.StandardFeature;  
import io.dcloud.util.JSUtil;  
import org.json.JSONArray;  
import org.json.JSONException;  
import org.json.JSONObject;  
import com.za.android060;  
import com.zafinger.ZA_finger;  
public class FingerPrintFeature extends StandardFeature{  

    public void openDevice(IWebview pWebview, JSONArray array){       
        int DEV_ADDR = 0xffffffff;  
        android060 a6= new android060();  
        try{  
            //a6.card_power_off(60, 3);  
            ZA_finger.fppower(1);  
            //ZA_finger.cardpower(1);  
            android.os.SystemClock.sleep(1000);  
            int status = a6.ZAZOpenDeviceEx(-1,2, 3, 12, 0, 0);  
            if(status!=1){  
                JSUtil.execCallback(pWebview, array.optString(0), "打开设备失败", JSUtil.ERROR, false);  
                return;  
            }  
            JSUtil.execCallback(pWebview, array.optString(0), "打开设备成功", JSUtil.OK, false);  
        }catch(Exception ex){  
            JSUtil.execCallback(pWebview, array.optString(0), "打开设备异常", JSUtil.ERROR, false);  
            return;  
        }  
    }  

    public void closeDevice(IWebview pWebview, JSONArray array)  
    {  
        int DEV_ADDR = 0xffffffff;  
        android060 a6= new android060();  
        try{  
            a6.ZAZCloseDeviceEx();  
            ZA_finger.fppower(0);  
            //ZA_finger.cardpower(0);  
            JSUtil.execCallback(pWebview, array.optString(0), "关闭设备成功", JSUtil.OK, false);  
        }catch(Exception ex){  
            JSUtil.execCallback(pWebview, array.optString(0), "关闭设备失败", JSUtil.ERROR, false);  
        }  
    }  

    public void doFingerPrint(IWebview pWebview, JSONArray array){  

        int DEV_ADDR = 0xffffffff;  
        android060 a6= new android060();  
        try{  
            int nRet = 0;  
            nRet = a6.ZAZGetImage(DEV_ADDR);  
            if(nRet == 0){  
                int[] len = { 0, 0 };  
                char[] Image = new char[256 * 288];  
                a6.ZAZUpImage(DEV_ADDR, Image, len);   
                String fingerPrintPath = android.os.Environment.getExternalStorageDirectory().getPath()+"/fingerPrint.bmp";  
                a6.ZAZImgData2BMP(Image, fingerPrintPath);  

                nRet= a6.ZAZGenChar(DEV_ADDR, a6.CHAR_BUFFER_A);  
                if(nRet ==a6.PS_OK){  
                    int[] iTempletLength = { 0, 0 };  
                    byte[] pTemplet = new byte[512];  
                    nRet=a6.ZAZUpChar(DEV_ADDR,a6.CHAR_BUFFER_A, pTemplet, iTempletLength);  
                    if(nRet ==a6.PS_OK){  
                        JSONObject obj = new JSONObject();  
                        obj.put("fingerPrintCode", charToHexString(pTemplet));  
                        obj.put("fingerPrintPath", fingerPrintPath);  
                        JSUtil.execCallback(pWebview, array.optString(0), obj, JSUtil.OK, false);  
                    }else{  
                        JSUtil.execCallback(pWebview, array.optString(0), "生成指纹特征码失败", JSUtil.ERROR, false);  
                    }  
                }else{  
                    JSUtil.execCallback(pWebview, array.optString(0), "指纹特征太差,重新录入", JSUtil.ERROR, false);  
                }     
            }else if(nRet==a6.PS_NO_FINGER){  
                JSUtil.execCallback(pWebview, array.optString(0), "未按手指", JSUtil.ERROR, false);  
            }else {  
                JSUtil.execCallback(pWebview, array.optString(0), "读取指纹失败", JSUtil.ERROR, false);  
            }  

        }catch(Exception ex){  
            JSUtil.execCallback(pWebview, array.optString(0), "读取指纹异常", JSUtil.ERROR, false);  
        }     
    }  

    private String charToHexString(byte[] val) {  
        String temp="";  
        for(int i=0;i<val.length;i++)  
        {   
            String hex = Integer.toHexString(0xff & val[i]);  
            if (hex.length() == 1) {   
                hex = '0' + hex;   
            }   
            temp += hex.toUpperCase();     
        }  
        return temp;  
    }  
}
继续阅读 »

基于厂家提供的例子 android060demo.rar

// FingerPrintFeature.java      
//依赖 demo 的 andriod060.java 和 za_finger.java;引入库 libandroid_060.so;把demo中的权限,加入项目  
//另 closeDevice方法 调用时发现有问题并没有调用,只open然后读取指纹发现没有问题  

package com.renhe.za.fingerPrintApi;  
import io.dcloud.DHInterface.IWebview;  
import io.dcloud.DHInterface.StandardFeature;  
import io.dcloud.util.JSUtil;  
import org.json.JSONArray;  
import org.json.JSONException;  
import org.json.JSONObject;  
import com.za.android060;  
import com.zafinger.ZA_finger;  
public class FingerPrintFeature extends StandardFeature{  

    public void openDevice(IWebview pWebview, JSONArray array){       
        int DEV_ADDR = 0xffffffff;  
        android060 a6= new android060();  
        try{  
            //a6.card_power_off(60, 3);  
            ZA_finger.fppower(1);  
            //ZA_finger.cardpower(1);  
            android.os.SystemClock.sleep(1000);  
            int status = a6.ZAZOpenDeviceEx(-1,2, 3, 12, 0, 0);  
            if(status!=1){  
                JSUtil.execCallback(pWebview, array.optString(0), "打开设备失败", JSUtil.ERROR, false);  
                return;  
            }  
            JSUtil.execCallback(pWebview, array.optString(0), "打开设备成功", JSUtil.OK, false);  
        }catch(Exception ex){  
            JSUtil.execCallback(pWebview, array.optString(0), "打开设备异常", JSUtil.ERROR, false);  
            return;  
        }  
    }  

    public void closeDevice(IWebview pWebview, JSONArray array)  
    {  
        int DEV_ADDR = 0xffffffff;  
        android060 a6= new android060();  
        try{  
            a6.ZAZCloseDeviceEx();  
            ZA_finger.fppower(0);  
            //ZA_finger.cardpower(0);  
            JSUtil.execCallback(pWebview, array.optString(0), "关闭设备成功", JSUtil.OK, false);  
        }catch(Exception ex){  
            JSUtil.execCallback(pWebview, array.optString(0), "关闭设备失败", JSUtil.ERROR, false);  
        }  
    }  

    public void doFingerPrint(IWebview pWebview, JSONArray array){  

        int DEV_ADDR = 0xffffffff;  
        android060 a6= new android060();  
        try{  
            int nRet = 0;  
            nRet = a6.ZAZGetImage(DEV_ADDR);  
            if(nRet == 0){  
                int[] len = { 0, 0 };  
                char[] Image = new char[256 * 288];  
                a6.ZAZUpImage(DEV_ADDR, Image, len);   
                String fingerPrintPath = android.os.Environment.getExternalStorageDirectory().getPath()+"/fingerPrint.bmp";  
                a6.ZAZImgData2BMP(Image, fingerPrintPath);  

                nRet= a6.ZAZGenChar(DEV_ADDR, a6.CHAR_BUFFER_A);  
                if(nRet ==a6.PS_OK){  
                    int[] iTempletLength = { 0, 0 };  
                    byte[] pTemplet = new byte[512];  
                    nRet=a6.ZAZUpChar(DEV_ADDR,a6.CHAR_BUFFER_A, pTemplet, iTempletLength);  
                    if(nRet ==a6.PS_OK){  
                        JSONObject obj = new JSONObject();  
                        obj.put("fingerPrintCode", charToHexString(pTemplet));  
                        obj.put("fingerPrintPath", fingerPrintPath);  
                        JSUtil.execCallback(pWebview, array.optString(0), obj, JSUtil.OK, false);  
                    }else{  
                        JSUtil.execCallback(pWebview, array.optString(0), "生成指纹特征码失败", JSUtil.ERROR, false);  
                    }  
                }else{  
                    JSUtil.execCallback(pWebview, array.optString(0), "指纹特征太差,重新录入", JSUtil.ERROR, false);  
                }     
            }else if(nRet==a6.PS_NO_FINGER){  
                JSUtil.execCallback(pWebview, array.optString(0), "未按手指", JSUtil.ERROR, false);  
            }else {  
                JSUtil.execCallback(pWebview, array.optString(0), "读取指纹失败", JSUtil.ERROR, false);  
            }  

        }catch(Exception ex){  
            JSUtil.execCallback(pWebview, array.optString(0), "读取指纹异常", JSUtil.ERROR, false);  
        }     
    }  

    private String charToHexString(byte[] val) {  
        String temp="";  
        for(int i=0;i<val.length;i++)  
        {   
            String hex = Integer.toHexString(0xff & val[i]);  
            if (hex.length() == 1) {   
                hex = '0' + hex;   
            }   
            temp += hex.toUpperCase();     
        }  
        return temp;  
    }  
}
收起阅读 »

JFinal社区客户端源码分享

案例 App 分享 源码

使用JFinal社区公开的接口和mui开发的社区客户端,开源给大家分享下,顺便来赚点积分
源码托管:http://git.oschina.net/20110516/jfbbs_mui
项目很简单,求喷轻点








继续阅读 »

使用JFinal社区公开的接口和mui开发的社区客户端,开源给大家分享下,顺便来赚点积分
源码托管:http://git.oschina.net/20110516/jfbbs_mui
项目很简单,求喷轻点








收起阅读 »

popover弹窗在有滚动条的情况下显示位置小问题

mui popover

popover的位置在有滚动条拖动后的情况下会弹出在可视窗口以下
可以修改mui.js解决:

if ((pHeight + arrowSize) < (offset.top - window.pageYOffset-window.scrollY+30)) { //top  
    pTop = offset.top - pHeight - arrowSize-window.scrollY;  
} else if ((pHeight + arrowSize) < (wHeight - (offset.top - window.pageYOffset-window.scrollY) - aHeight)) { //bottom  
    position = 'bottom';  
    pTop = offset.top + aHeight + arrowSize-window.scrollY+18;  
} else { //middle  
    position = 'middle';  
    pTop = Math.max((wHeight - pHeight) / 2 + window.pageYOffset-window.scrollY, 0);  
    pLeft = Math.max((wWidth - pWidth) / 2 + window.pageXOffset, 0);  
}

window.scrollY是滚动条的高度
window.scrollY+30是考虑到一般app都有header和nav,+30避免被他们挡住弹窗

继续阅读 »

popover的位置在有滚动条拖动后的情况下会弹出在可视窗口以下
可以修改mui.js解决:

if ((pHeight + arrowSize) < (offset.top - window.pageYOffset-window.scrollY+30)) { //top  
    pTop = offset.top - pHeight - arrowSize-window.scrollY;  
} else if ((pHeight + arrowSize) < (wHeight - (offset.top - window.pageYOffset-window.scrollY) - aHeight)) { //bottom  
    position = 'bottom';  
    pTop = offset.top + aHeight + arrowSize-window.scrollY+18;  
} else { //middle  
    position = 'middle';  
    pTop = Math.max((wHeight - pHeight) / 2 + window.pageYOffset-window.scrollY, 0);  
    pLeft = Math.max((wWidth - pWidth) / 2 + window.pageXOffset, 0);  
}

window.scrollY是滚动条的高度
window.scrollY+30是考虑到一般app都有header和nav,+30避免被他们挡住弹窗

收起阅读 »