Android实现局域网二维码分享图片(带密码验证)

简介: 最近接到一个需求,需要实现一个局域网的图片二维码分享功能;具体怎么样呢?一起看看文章吧!

最近接到一个需求,需要实现一个局域网的图片二维码分享功能;具体怎么样呢,先看下面的效果图:


image

由于是局域网,请使用真机,如果有两个手机更好了,连接同个局域网就可以看到;如果是只有一个手机,那就电脑上看把, 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开发者门户”。

相关文章
|
6月前
|
存储 缓存 编解码
Android经典面试题之图片Bitmap怎么做优化
本文介绍了图片相关的内存优化方法,包括分辨率适配、图片压缩与缓存。文中详细讲解了如何根据不同分辨率放置图片资源,避免图片拉伸变形;并通过示例代码展示了使用`BitmapFactory.Options`进行图片压缩的具体步骤。此外,还介绍了Glide等第三方库如何利用LRU算法实现高效图片缓存。
101 20
Android经典面试题之图片Bitmap怎么做优化
|
7月前
|
数据处理 开发工具 数据安全/隐私保护
Android平台RTMP推送|轻量级RTSP服务|GB28181接入之文字、png图片水印的精进之路
本文探讨了Android平台上推流模块中添加文字与PNG水印的技术演进。自2015年起,为了满足应急指挥及安防领域的需求,逐步发展出三代水印技术:第一代为静态文字与图像水印;第二代实现了动态更新水印内容的能力,例如实时位置与时间信息;至第三代,则优化了数据传输效率,直接使用Bitmap对象传递水印数据至JNI层,减少了内存拷贝次数。这些迭代不仅提升了用户体验和技术效率,也体现了开发者追求极致与不断创新的精神。
|
7月前
|
自然语言处理 定位技术 API
Android经典实战之如何获取图片的经纬度以及如何根据经纬度获取对应的地点名称
本文介绍如何在Android中从图片提取地理位置信息并转换为地址。首先利用`ExifInterface`获取图片内的经纬度,然后通过`Geocoder`将经纬度转为地址。注意操作需在子线程进行且考虑多语言支持。
389 4
|
7月前
|
XML 前端开发 Android开发
Android经典实战之Kotlin中实现圆角图片和圆形图片
本文介绍两种实现圆角图像视图的方法。第一种是通过自定义Kotlin `AppCompatImageView`,重写`onDraw`方法使用`Canvas`和`Path`进行圆角剪裁。第二种利用Android Material库中的`ShapeableImageView`,简单配置即可实现圆角效果。两种方法均易于实现且提供动态调整圆角半径的功能。
140 0
|
9月前
|
JSON 编解码 Apache
Android中使用HttpURLConnection实现GET POST JSON数据与下载图片
Android中使用HttpURLConnection实现GET POST JSON数据与下载图片
96 1
|
9月前
|
前端开发 Java API
Android系统中读写和显示图片
Android系统中读写和显示图片
63 0
|
9月前
|
XML Java API
54. 【Android教程】图片资源:Drawable
54. 【Android教程】图片资源:Drawable
132 0
|
9月前
|
Java Android开发
18. 【Android教程】图片控件 ImageView
18. 【Android教程】图片控件 ImageView
145 4
|
10月前
|
Java Android开发
android 下载图片的问题
android 下载图片的问题
73 3
|
10月前
|
Android开发
Android通过手势(多点)缩放和拖拽图片
Android通过手势(多点)缩放和拖拽图片
90 4

热门文章

最新文章

  • 1
    Android历史版本与APK文件结构
  • 2
    【01】噩梦终结flutter配安卓android鸿蒙harmonyOS 以及next调试环境配鸿蒙和ios真机调试环境-flutter项目安卓环境配置-gradle-agp-ndkVersion模拟器运行真机测试环境-本地环境搭建-如何快速搭建android本地运行环境-优雅草卓伊凡-很多人在这步就被难倒了
  • 3
    【03】仿站技术之python技术,看完学会再也不用去购买收费工具了-修改整体页面做好安卓下载发给客户-并且开始提交网站公安备案-作为APP下载落地页文娱产品一定要备案-包括安卓android下载(简单)-ios苹果plist下载(稍微麻烦一丢丢)-优雅草卓伊凡
  • 4
    【01】仿站技术之python技术,看完学会再也不用去购买收费工具了-用python扒一个app下载落地页-包括安卓android下载(简单)-ios苹果plist下载(稍微麻烦一丢丢)-客户的麻将软件需要下载落地页并且要做搜索引擎推广-本文用python语言快速开发爬取落地页下载-优雅草卓伊凡
  • 5
    【03】微信支付商户申请下户到配置完整流程-微信开放平台创建APP应用-填写上传基础资料-生成安卓证书-获取Apk签名-申请+配置完整流程-优雅草卓伊凡
  • 6
    【02】仿站技术之python技术,看完学会再也不用去购买收费工具了-本次找了小影-感觉页面很好看-本次是爬取vue需要用到Puppeteer库用node.js扒一个app下载落地页-包括安卓android下载(简单)-ios苹果plist下载(稍微麻烦一丢丢)-优雅草卓伊凡
  • 7
    Cellebrite UFED 4PC 7.71 (Windows) - Android 和 iOS 移动设备取证软件
  • 8
    escrcpy:【技术党必看】Android开发,Escrcpy 让你无线投屏新体验!图形界面掌控 Android,30-120fps 超流畅!🔥
  • 9
    Android实战经验之Kotlin中快速实现MVI架构
  • 10
    即时通讯安全篇(一):正确地理解和使用Android端加密算法