Android实现局域网二维码分享图片(带密码验证)
最近接到一个需求,需要实现一个局域网的图片二维码分享功能;具体怎么样呢,先看下面的效果图:
由于是局域网,请使用真机,如果有两个手机更好了,连接同个局域网就可以看到;如果是只有一个手机,那就电脑上看把, html 的布局有点丑,因为主要是 适配手机,我也不擅长这一块,见怪不怪吧。
一、需求分析
要实现局域网,一般就是搭建个 ServerSocket,设备连接时输出网址即可
二维码分享,没啥好说,zxing .
咦,好像就没了啊,关键是局域网这个服务器了, 搭建 Android 的局域网,自己写的话,估计调试都调到很久,github 搜了一下,主要有三个,AndServer ,国人写的,思路比较适合我们,但有时会遇到连接超时的问题,不知道是不是我网络的问题;还有 NanoHttpd 和 AndroidAsync,NanoHttpd 适合java,且调试不好调试,最后选择了 AndroidAsync,接入简单,而且接口也比较好用。(以上只是个人观点),但 AndroidAsync 关于服务器方面的资料还是比较少的,所以得看源码了,不过这里也做了一些封装,到时可以参考一下。
二、代码配置
局域网,首先需要有网络,所以这里直接检查网络好了,需要检测 WiFi 是否能检测到,这里的 WiFi 的 IP 获取也比较简单,当检测到 WiFi 连接了,直接拿就是了:
//wifi是否连接 if (CusUtil.isWifiConnected()){ //获取 ip DEVICE_IP = CusUtil.getWifiIpaddr(); StringBuilder sb = new StringBuilder(); sb.append("请在同个wifi下,扫描该二维码,或者浏览器中输入: \n") .append("http://"+DEVICE_IP+":"+SERVER_PORT) .append("\n或者输入:\n") .append("http://"+DEVICE_IP+":"+SERVER_PORT+"/password"); textView.setText(sb.toString()); }else{ textView.setText("您还未连接 wifi "); }
如果 WiFi 获取了,则开始配置数据,主要是 ip 和port,当然还有添加拦截器,图片和密码还是需要拦截的。
private void startLanServer(){ mCheckRequestHandle = CheckRequestHandle.create(this,DEVICE_IP,SERVER_PORT); //配置数据,builder 模式 LanServerBean bean = LanServerBean.lanBuilder() .setPort(SERVER_PORT) .setIpAddr(DEVICE_IP) //配置默认 html 字符串 .setDefaultHtml(CusUtil.getDefaultString(DEVICE_IP,SERVER_PORT)) //添加拦截,当检测 image,输出图片 .registerHandler("image", ImageRequestHandle.create(this)) //添加拦截,当检测 password,弹出密码验证框 .registerHandler("password",mCheckRequestHandle) .builder(); if (mServiceBinder != null) { mServiceBinder.startLanServer(bean); } }
如果自己有新的需求,也可以继续添加拦截器,拦截器也比较简单,AndroidAsync 的 api 还是比较人性化的:
public class ImageRequestHandle implements HttpServerRequestCallback { private static final String TAG = "ImageRequestHandle"; private Context mContext; private ImageRequestHandle(Context context){ mContext = context; } public static ImageRequestHandle create(Context context){ return new ImageRequestHandle(context); } @Override public void onRequest(AsyncHttpServerRequest request, AsyncHttpServerResponse response) { try { InputStream is = mContext.getAssets().open("beauty.jpg"); //输入图片 response.sendStream(is,is.available()); } catch (Exception e) { e.printStackTrace(); } } }
html 的获取都是在 assets 中,而一些动态的,比如 ip 和 端口,则是通过 代码重新添加,关于 html 的基础,就不解释啦,自己去撸吧:
/** * 输出验证密码的html * @return */ public static String getCheckPasswordHtml(String ipaddr,int port,String password){ StringBuilder sb = new StringBuilder(); sb.append(CusUtil.getAssetsString("checkpass.html")).append("\n") .append("<button class=\"button\" onclick=\"checkPassword(") .append(password+",'"+"http://"+ipaddr+":"+port+"')\">确定</button>").append("\n") .append(" </div>").append("\n") .append(" </div>").append("\n") .append(" </body>").append("\n") .append(" </html>").append("\n"); return sb.toString(); }
三、扩展
继续局域网分享图片已经懂了,那么像局域网传输文件,信息共享等等,都是可以搞的。比如比较火的 WiFi 传书,就是这个原理。多去折腾吧。
四、代码地址
完整的文章代码可以查看Github地址:https://github.com/LillteZheng/LanServer
原文发布时间为:2018-0717
本文作者:LillteZheng
本文来自云栖社区合作伙伴“ 安卓巴士Android开发者门户”,了解相关信息可以关注“ 安卓巴士Android开发者门户”。

低调大师中文资讯倾力打造互联网数据资讯、行业资源、电子商务、移动互联网、网络营销平台。
持续更新报道IT业界、互联网、市场资讯、驱动更新,是最及时权威的产业资讯及硬件资讯报道平台。
转载内容版权归作者及来源网站所有,本站原创内容转载请注明来源。
- 上一篇
linux中btt工具详解
在之前的文章中介绍了如何使用blktrace 以及其工作原理和架构。我们知道blktrace 跟踪块设备的统计信息,每个CPU会有一个文件存储,然后通过blkparse可以将这些文件整合成一个文件来显示。 不过blkparse显示的文件过于庞大,而通过btt分析后会发现监控数据变得更加有意义。 1. 示例 监控获得数据 #blktrace -d /dev/sda -o sdatest 合并多个文件 #blkparse -i sdatest -d sdatest.bin #btt -i sdatest.bin 2. 输出简要信息 第一部分平均时间 IO时间主要是分为三个区域: nÂÂ 插入或合并IO到请求队列的时间,计算从块层到插入,即Q2I(Q2I=Q2G+G2I) nÂÂ 请求队列到驱动的时间,即是I2D。 nÂÂ 驱动和设备时间,即是D2C. 此外还有还有Q2Q表示IO交到块层的时间。系统等待请求的时间在Q2G中。一般情况下Q2C=Q2I+I2D+D2C,说一般情况因为有些IO会会执行merge。 把大写字母函数的表,再次方便查找: Act Description A IO wa...
- 下一篇
如何解决Android开发过程中缺乏UI素材的问题
如何解决开发过程中缺乏UI素材的问题 原则上来说,我们应该尽量把时间花在自己的专业开发上。但偶尔我们还是不得不面临需要UI素材问题,比如应付学校的项目作业,自己的个人开源项目,这些都是不太可能有UI设计师帮你完成的。 素材网站 阿里巴巴矢量库 这是个图标网站,下面是成套的软件图标。我们可以直接在搜索栏中输入我们想要的图标类型,选择想要的颜色,大小,格式 GIF4.gif unsplash 图片素材网站 MaterialDesignPelette MaterialDesign风格图标,配色 Colorless.app 这是一个可以让你在网页上快速切换颜色并预览的工具,帮你调整出喜欢的主色用于 app UI 中。 预览App颜色.png 其他 其他的,还有像摄图网,千库网,千图网,不过这些都是要收费的。另外如果是参考创意的话可以去站酷,UI中国看看, 原型设计软件 倘若我们需要画出简单的原型,那就需要用到原型设计软件了,这里推荐一个很好用的原型设计软件,Adobe Xd Adobe xd 介绍AdobeXd的中文网站 有的时候也需要使用Photoshop来对图片进行一些处理 反编译&a...
相关文章
文章评论
共有0条评论来说两句吧...