Android监听底部导航栏展开与隐藏

Android监听底部导航栏展开与隐藏

1年前 (2016-08-12) 浏览: 580 评论: 2

现在有些android手机具有底部虚拟按键的导航栏,这一设计去掉了物理按键,进一步增加了智能手机的屏占比。但这有时带来一些兼容性问题。 为了防止导航栏遮住布局,可以在布局上面添加“fitSystemWindows=true”属性。 如果要想监听导航栏的隐藏与显示,我们可以在布局文件的根节点下添加一个宽度和高度都“match_parent”的空布局,同时在布局上面添加“fitSystemWindows=true”属性,然后监听此布局的onLayoutChange事件,即可监听导航栏。

Android webview广告过滤的实现

Android webview广告过滤的实现

1年前 (2016-05-02) 浏览: 4248 评论: 1

现在大部分的android平台的浏览器都具有广告过滤的功能,同时大部分网站都有广告。广告行业是个盈利巨大的产业,就我看来,现在绝大部分的互联网产品,一般有两种营利模式:免费有广告和会员无广告;他们大部分(包括网站和APP等)盈利来源就是广告。作为用户而言,对广告十分反感,但是互联网上的服务我们能免费享受与支撑这些服务得以延续与成长却得益于广告。 百度了一下,网上竟然没有Android浏览器屏蔽广告的代码实现,所以极客人只能自己动手了。网页上的广告一般是站长在网页植入一段js代码,要想屏蔽广告只需要将这些js屏蔽掉即可。 WebViewClient的几个回调函数 要想对Webview实现一些高级操作,首先要学习WebViewClient的用法,这是Webview几个常用回调函数 1、public boolean shouldOverrideUrlLoading(WebView view, String url) : 在点击请求的是链接是才会调用,重写此方法返回true表明点击网页里面的链接还是在当前的webview里跳转,不跳到浏览器那边。 2、public void onReceivedSslError(WebView view, SslErrorHandler handler, android.net.http.SslError error): 重写此方法可以让webview处理https请求。 3、public boolean shouldOverrideKeyEvent(WebView view, KeyEvent event):重写此方法才能够处理在浏览器中的按键事件。 4、 public void onLoadResource(WebView view, String url) :在加载页面资源时会调用,每一个资源(比如图片)的加载都会调用一次。 5、 public void onPageStarted(WebView view, String url, Bitmap favicon) :在页面加载开始时调用。 6、public void onPageFinished(WebView view, String url) :在页面加载结束时调用。 初看上面的回调函数,极客人发现了一个巨大的坑,拦截广告就是拦截加载广告的js,上面的onLoadResource似乎是很合适的函数,只要判断onLoadResource的参数url是否是加载广告js的即可,如果不是广告相关的url正常加载,如果是则不加载。但是在使用onLoadResource之后才发现根本不行。 这里引用WebViewClient另外一个回调函数:public WebResourceResponse shouldInterceptRequest(WebView view, String url) shouldInterceptRequest有两种重载。 public WebResourceResponse shouldInterceptRequest (WebView view, String url) 从API 11开始引入,API 21弃用 public WebResourceResponse shouldInterceptRequest (WebView view, WebResourceRequest request) 从API 21开始引入 这里极客人暂且使用shouldInterceptRequest (WebView view, String url)完成对webview广告的拦截。 拦截广告资源URL 在Webview加载资源时会回调shouldInterceptRequest函数,我们可以通过重写shouldInterceptRequest函数实现对webview的资源请求进行处理。进行处理后返回数据。如果主程序返回的数据为null,WebView会自行请求网络加载资源。这里有个坑:不是shouldInterceptRequest函数返回null就能屏蔽掉请求!正确的屏蔽请求的方式: 下面是极客人写的屏蔽广告的NoAdWebViewClient类: 只需使用webview.setWebViewClient(NoAdWebViewClient webclient)即可屏蔽指定webview的广告。 判断URL是否含广告的ADFilterTool类:该类通过判断url是否包含在广告拦截库中 ADFilterTool.java 广告url资源文件(广告拦截库可自行百度更新):AdUrlString.xml 所谓广告拦截库,实际上是请求广告资源的url合集,网络上有大量的广告拦截库,读者可以定期更新一下文件来实现对广告的高效过滤。本文屏蔽的方式比较粗暴,凡是含有广告资源的域名统统禁止。要想实现更精准的过滤,访友你可以使用通配符匹配url的方式进行拦截,现在PC端的浏览器正是这样做的。    

一个简单的局域网UDP实时视频

一个简单的局域网UDP实时视频

2年前 (2016-04-12) 浏览: 819 评论: 1

之前一直有打算做一个局域网上基于UDP通信的视频通话软件,一直不知道视频流在网络上以怎样的形式传输,虽然知道几个视频流的编码格式,但是其实一直没有进行付诸实践; 最近在学习安卓手表开发时,在github上看到一个将手机的实时视频传输到手表的项目,发现一个似乎低级但是在局域网应该还是比较实用的局域网视频传输方法:直接将从摄像头获取的图像压缩以后进行发送。本项目GitHub主页:https://github.com/retravel/AndroidRealTimeVideo 获取摄像头实时图片、UDP发送图片  UDP server  

百度地图API位置偏移的校准算法

百度地图API位置偏移的校准算法

2年前 (2016-02-17) 浏览: 2315 评论: 0

在开始使用百度地图API进行开发时可能会遇到一件相当奇怪的事情,使用百度定位的经纬度在地图上显示相当不准确,这一问题我在微信开发和安卓开始时都遇到过。第一次使用百度地图api获取位置并在地图上显示是在微信开发的时候,那是不知道具体原因无奈在微信获取的地理位置上加了一个偏移量进行校准,虽能勉强解决,但是不太准确。后来在安卓开始也同样遇到了这个问题,才发现百度地图API定位偏移已经不是一个偶然问题了。 百度地图API定位偏移的原因 以下来自互联网: 一、坐标体系 首先我们要明白,开发者能接触到哪些坐标体系呢? 第一种分类: 1、 GPS,WGS-84,原始坐标体系。一般用国际标准的GPS记录仪记录下来的坐标,都是GPS的坐标。很可惜,在中国,任何一个地图产品都不允许使用GPS坐标,据说是为了保密。GPS坐标形式如图,度分秒形式的经纬度:   2、 GCJ-02,国测局02年发布的坐标体系。又称“火星坐标”。在中国,必须至少使用GCJ-02的坐标体系。比如谷歌,腾讯,高德都在用这个坐标体系。GCJ-02也是国内最广泛使用的坐标体系。 3、 其他坐标体系。一般都是由GCJ-02进过偏移算法得到的。这种体系就根据每个公司的不同,坐标体系都不一样了。比如,百度和搜狗就使用自己的坐标体系,与其他坐标体系不兼容。 第二种分类: 首先明白,所有坐标体系的原点,都是非洲。 1、 经纬度。这个是球面坐标,对于北京来说,就是(116.38817139.935961)这样的坐标。比如腾讯、高德、百度都是这样的经纬度坐标。谷歌是经纬度顺序写反的经纬度坐标。 如果是度分秒坐标,需要进行转换,才能得到这样的经纬度坐标。详见坐标转换。 2、 墨卡托坐标。平面坐标,相当于是直线距离,数字一般都比较大,像这样的。(215362.00021333335 99526.00034912192) 墨卡托坐标,主要用于程序的后台计算。直线距离嘛,加加减减几乎计算方便。 搜狗地图API就是直接使用的墨卡托坐标。 二、坐标转换 在各种web端平台,或者高德、腾讯、百度上取到的坐标,都不是GPS坐标,都是GCJ-02坐标,或者自己的偏移坐标系。 比如,你在谷歌地图API,高德地图API,腾讯地图API上取到的,都是GCJ-02坐标,他们三家都是通用的,也适用于大部分地图API产品,以及他们的地图产品。 例外,百度API上取到的,是BD-09坐标,只适用于百度地图相关产品。 例外,搜狗API上取到的,是搜狗坐标,只适用于搜狗地图相关产品。 例外,谷歌地球,google earth上取到的,是GPS坐标,而且是度分秒形式的经纬度坐标。在国内不允许使用。必须转换为GCJ-02坐标。 1、度分秒坐标转换为经纬度 比如,在GPS记录仪,或者google earth上采集到的是39°31'20.51,那么应该这样换算,31分就是31/60度,20.51秒就是20.51/3600度,结果就是39 + 31/60 + 20.51/3600 度。 2、 GPS转换为GCJ-02坐标 谷歌,高德,腾讯的地图API官网上,都不直接提供这样的坐标转换。如果要得到GCJ-02坐标,最好在他们的地图上直接取点,或者通过地址解析得到。(这个工具我后续会贴出来的。我就爱干这样的事情,哈哈。) 不过,在网上搜到了这样的接口,该接口的type=1就是GPS转到GCJ-02的墨卡托坐标。请大家对接口保密,哈哈。详见: http://map.sogou.com/api/documentation/javascript/api2.5/interface_translate.html#late_intro 3、GCJ-02与BD-09之间互转 国测局GCJ-02坐标体系(谷歌、高德、腾讯),与百度坐标BD-09体系的转换,在CSDN上有很详细的讲解: http://blog.csdn.net/coolypf/article/details/8569813 不过也有更简单的算法,线性算法(lat和lng是经纬度,球面坐标): To_B是转到百度,To_G是转到GCJ-02。 var TO_BLNG = function(lng){return lng+0.0065;}; var TO_BLAT = function(lat){return lat+0.0060;}; var TO_GLNG = function(lng){return lng-0.0065;}; var TO_GLAT = function(lat){return lat-0.0060;}; 4、经纬纬度转成墨卡托 网上也有详细讲解: http://bbs.esrichina-bj.cn/esri/viewthread.php?tid=78245 (大家发现没,高德是api,腾讯和百度是mapapi,说明什么?) 三、坐标偏移 如果您的坐标在转换之后,还有偏移,那么考虑以下几个方面。 A、原始坐标系弄错,比如以为自己是GPS坐标,但其实已经是GCJ-02坐标。 解决方案:请确保采集到的数据是哪个坐标体系,需要转换到哪个坐标系,再进行坐标转换。 B、原始坐标准确度不够 解决方案:如果您是GPS坐标,请确保采集GPS数据时,搜到至少4颗以上的卫星。并且GPS数据准不准,还取决于周围建筑物的高度,越高越不准,因为有遮挡。 如果本来就是GCJ-02坐标,在不同地图放大级别的时候,看到的地方可能不一样。比如你在地图级别4(国家)取到的坐标,放大到地图12级(街道)时,坐标就偏了。请确保在地图最大放大级别时,拾取坐标。 C、度分秒的概念混淆 比如,在google earth上采集到的是39°31'20.51,那么应该这样换算,31分就是31/60度,20.51秒就是20.51/3600度,结果就是39 + 31/60 + 20.51/3600 度。 D、经纬度顺序写反了 有些公司(比如高德,百度,腾讯)是先经度,再纬度,即Point(lng lat)。但谷歌坐标的顺序恰好相反,是(lat lng)。 相关问题的百度解释:http://developer.baidu.com/map/question.htm 百度地图API位置偏移的校准算法 C++算法  

webview显示富文本与JS和java的交互

webview显示富文本与JS和java的交互

2年前 (2016-01-15) 浏览: 216 评论: 1

WebView是安卓下显示网页的控件,使用它可以实现一个简单的浏览器,访问互联网上的网页。也可以当作一个本地的文本显示控件,和textView类似。用 WebView 或者 TextView 来显示 HTML 内容,其交互的实现方式有较大的区别,以在 HTML 内容中的图片点击事件为例,在 WebView 模式下,开发人员需要通过注入 JavaScript 代码来进行点击事件的响应,Android 系统提供了 WebView 中 JavaScript 网页脚本调用 Java 类方法的机制;而在 TextView 中,图片会被解析为 ImageSpan,通过在 ImageSpan 上注册点击事件来响应。   一、webview显示富文本 比如iniHtml为一段String类型的html代码,使用 即可在webview上显示这段html。   二、webview显示项目资源中网页文件 我们可以将一个html文件index.html放在项目的assets文件下,使用WebView.loadUrl("file:///android_asset/index.html")来显示这个html文件,在这个html文件如果要引用asserts文件夹下的css、js文件,同样使用file:///android_asset/ ; 来访问。 三、java中调用javascript函数 使用loadurl调用java代码 四、javascript怎样调用java函数 在webview使用javascript调用外部的java函数可以让android的webview显示富文本有一种更加原生的体验,而不会让使用者感觉他在使用一个浏览器在查看你的显示文本。为了能让javascript调用java中代码,安卓采取将javascript的一个window下的对象M与java中的对象N做一个绑定或者说是映射,这样在javascript下对M的操作就相当于在java下N的操作。 实现方法:webview启用javascript,绑定js对象 addJavascriptInterface(Object object, String name)函数中第一个参数object是java下的对象,name是映射到javascript下的对象名。你可以为java下的object比如当前的activity申明一个click()函数,在javascript下使用window.name.click() 即可出发java下click函数。 需要指出的是在java中的click函数需要添加声明 @JavascriptInterface

网页添加链接调用APP与跳转下载网址

网页添加链接调用APP与跳转下载网址

2年前 (2016-01-09) 浏览: 325 评论: 1

在京东、百度糯米等网站的手机端网页上,常常有有个悬浮提示“点击打开客户端”,如果用户在手机上安装了客户端,将会自动调用客户端打开与当前网页内容一致的客户端页面;如果用户没有安装这些APP,浏览器将会跳转到下载网址,让用户下载客户端。在王柏元的博客客户端中也实现了这一功能。 之前在《安卓实现打开指定链接调用其他应用程序》介绍了如果让客户端点击特定链接(APPLINK)时自动调用客户端软件,在此再次重复一遍: 在打开指定链接需要跳转到的Activity的AndroidManifest.xml清单文件中中加入一条intent-filter标签,并如下面的例子设置scheme、HOST等属性。 怎样链接到客户端指定页面 通过 category android:name="android.intent.category.BROWSABLE" /> <data android:scheme="wbyblog" android:host="wangbaiyuan.cn" android:pathPrefix="/home"/> 这一Intent调用Activity不仅能在applink被点击时启动该APP,还支持类似HTTP的GET传值,这就是跳转到网页对应的客户端页面的前提。 比如:王柏元的博客客户端注册了android:scheme="wbyblog" android:host="wangbaiyuan.cn" android:pathPrefix="/post" 的Intent的postActivity,在浏览器打开链接:"wbyblog://wangbaiyuan.cn/post?postid=1234**&title=网页添加链接调用APP与跳转下载网址 "时,将把postid:1234**和title:网页添加链接调用APP与跳转下载网址 传入postActivity;在postActivity中通过下列代码实现获取传入的值。 这样你就可以根据传值显示特定的app页面了 网页端实现已安装客户端则调用、无则下载 在服务端我们需要动态生成当前网页对应的APPLINK,并通过一个悬浮固定的div显示applink,以便醒目吸引用户点击。比如极客人实现的在手机网页、文章页面,生成有该链接的div(电脑不予显示): 其中关键部分为下面的js代码: js实现了让浏览器打开applink从而自动调用你的app(当然前提是你安装了),并在1000m后跳转到app下载页面,其它并不能判断你的手机上是否安装了你的APP,但是展现的效果是一样的!

百度云推送实现博客新文章提醒

百度云推送实现博客新文章提醒

2年前 (2016-01-07) 浏览: 132 评论: 1

在开发王柏元的博客客户端时,为了加入新文章发布时实现客户端通知的效果,极客人采用了百度云推送平台,使用百度官方提供的SDK和demo成功实现。服务端发送通知时,客户端会执行onNotificationClicked 回调函数。该函数的形参分别为 Context context:上下文 String title:通知标题 String description:通知内容 String customContentString:自定义字段,通过json可获取服务端的传值。 安卓端 服务器端代码需要引入sdk.php,关键是服务器要支持cUrl模块。我的阿里云免费主机就不支持,后来我消息推送的代码放在景安的虚拟主机上,通过阿里云调用URL的方式执行在景安主机上的PHP文件,解决了这一问题。 PHP服务器端    

触类旁通学习swift(1)语言简述

触类旁通学习swift(1)语言简述

2年前 (2015-12-30) 浏览: 128 评论: 0

由于要参加一个iOS竞赛,所以极客人最近开始学习swift语言。swift语言是苹果2014年发布的一个开发苹果旗下软件的一种新的编程语言,貌似有取缔之前用来开发苹果软件的objective c语言的势头,所以个人觉得学习swift还是比较有前途的。由于开发iOS必须要MAC系统,之前花费了大量的时间给我的戴尔电脑安装了“黑苹果”,但因为驱动问题导致无法联网,十分影响学习。为此,十分感谢杨帆老师借了我一台闲置的MAC电脑。 与之前学习过的c++,java,php,javascript语言相比,swift语言在我看来更加高端或者说“高级”,比java等语言比swift更加简洁,对一些诸如数组等数据类型的操作功能极为强大,写相同量大swift的代码可以做很多的事情。简洁、高级的swift可以节省程序员打字的工作量,但是也意味着这个语言可能的封装度更大。封装性让成员易于操作但会让程序员离底层越来越远,上层函数的记忆量就会加大。swift和其它高级语言的不同还是很大的,不像java和php相似度极大,只要学会java,php在短时间内即可无师自通。 学过几门计算机语言之后,我认为再学习一门新的语言时与之前语言的比较十分重要。所以在学习swift时很有必要把它和其他语言进行类比学习,以加强记忆,防止各种语言之间的“串味”。 swift面向什么? swift和php相似,既支持面向过程又支持面向对象,没必要把所有的操作都写成一个类和方法,而java则是严格的面向对象语言。但PHP是一种脚本语言,但是swift不是,脚本语言是解释执行的,执行文件是文本; 编译语言,执行文件是二进制,swift需要经过编译生成一个二进制的可执行文件。 swift不是弱类型 swift和javascript一样没有显式地声明变量类型,但是在没有声明变量类型的swift会根据情况自动推断出变量类型。比如var a="hello world",a会被推断为string类型。

支持自动提示的多引擎的搜索框

支持自动提示的多引擎的搜索框

2年前 (2015-12-30) 浏览: 219 评论: 0

使用网上开源的导航站源码制作了我的导航网页“百元导航”后,总觉得它丢掉了导航网站的一个很重要的东西—搜索框。于是极客人为自己的导航站加入了搜索框的功能,支持百度搜索、好搜、极客搜、CSDN搜索、蒲公英PT搜索等(可以加代码轻松扩展),除了网站界面使用了网上的代码,逻辑处理部分的js代码全由本人实现。 html代码: 下面是搜索框的界面的html部分,CSS没有贴在下面,如果需要请留言: javascript代码 要想搜索框支持多搜索引擎切换,首先需要掌握搜索引擎搜索关键词的URL参数,查看有几个GET参数(搜索引擎一般都是用GET传值的),比如下面是搜索引擎搜索“王柏元的博客”的结果页的URL: https://www.baidu.com/s?ie=UTF-8&wd=%E7%8E%8B%E6%9F%8F%E5%85%83 ?ie后面是编码格式,wd后面是搜索的关键词的URLEncode编码。 所以只要做一个表单,在表单内部加入name="ie"的DOM元素,这个元素没有必要在界面上显示,可以在CSS样式中加入“display:none”,下面的addparams函数实现的就是这一功能;再加入name="wd"的文本框,就是输入关键词的那个搜索框。最后将表单的action设置为百度搜索关键词网址:https://www.baidu.com/s 下面的setEngine函数就是切换搜索引擎的函数。传入searchIndex,就是html中select下option的value; 为了在用户切换搜索引擎后,再次打开导航页默认显示切换后的搜索引擎,可采用cookie记录searchIndex。 下面的代码用以在切换搜索引擎时,如果搜索框不为空则自动搜索搜索框内关键词,不用点击“搜索按钮”。 搜索框加入百度搜索自动提示 其中搜索自动提示的功能采用了百度开放的百度搜索框提示:引入一个百度的opensug.js文件,然后在要绑定搜索提示的文本框input元素中加入baiduSug="1"。这样在绑定的搜索框中输入文字即可获得和百度一样的搜索提示。 比如: 网上说百度搜索提示还有很多高级用法,比如自定义搜索提示的背景颜色、字体等等。不过极客人试过发现并不支持,你可以自行尝试,成功了欢迎来王柏元的博客交流!

PHP获取指定日期的农历和节日

PHP获取指定日期的农历和节日

2年前 (2015-12-25) 浏览: 1668 评论: 2

今天是圣诞节,用了半天做了一个节日祝福语和节日主题,效果还不错。可以在洋节和中国节日(包括农历节日 春节、中秋节等等)当天更换王柏元的博客的节日主题,并在站点公告里送上节日祝福语。 下面是关键的PHP类:Lunar。其中的getFestival()函数可传入的实参是不定数目的,可以通过传入的公历年月日,不传入默认是当前的服务器时间,函数实现了判断指定日期是否是已经设定的节日:比如中秋节、春节,同时还输出节日祝福语或诗句,返回的形式是一个数组。其余几个函数实现了获取公历和农历之间的转换,农历还支持返回当前日期农历的天干地支纪年以及生肖。    

登录

忘记密码 ?

您也可以使用第三方帐号快捷登录

切换登录

注册