精华内容
下载资源
问答
  • java实现二维码扫码下载APP

    千次阅读 2015-10-16 18:55:54
    java实现二维码扫码下载APP

    1.需要的组件

      /**
         * 生成二维码(QRCode)图片的公共方法
         * @param content 存储内容
         * @param imgType 图片类型
         * @param size 二维码尺寸
         * @return
         */ 
        private static BufferedImage qRCodeCommon(String content, String imgType, int size) { 
            BufferedImage bufImg = null; 
            try { 
                Qrcode qrcodeHandler = new Qrcode(); 
                // 设置二维码排错率,可选L(7%)、M(15%)、Q(25%)、H(30%),排错率越高可存储的信息越少,但对二维码清晰度的要求越小 
                qrcodeHandler.setQrcodeErrorCorrect('M'); 
                qrcodeHandler.setQrcodeEncodeMode('B'); 
                // 设置设置二维码尺寸,取值范围1-40,值越大尺寸越大,可存储的信息越大 
                qrcodeHandler.setQrcodeVersion(size); 
                // 获得内容的字节数组,设置编码格式 
                byte[] contentBytes = content.getBytes("utf-8"); 
                // 图片尺寸 
                int imgSize = 67 + 12 * (size - 1); 
                bufImg = new BufferedImage(imgSize, imgSize, BufferedImage.TYPE_INT_RGB); 
                Graphics2D gs = bufImg.createGraphics(); 
                // 设置背景颜色 
                gs.setBackground(Color.WHITE); 
                gs.clearRect(0, 0, imgSize, imgSize); 
     
                // 设定图像颜色> BLACK 
                gs.setColor(Color.BLACK); 
                // 设置偏移量,不设置可能导致解析出错 
                int pixoff = 2; 
                // 输出内容> 二维码 
                if (contentBytes.length > 0 && contentBytes.length < 800) { 
                    boolean[][] codeOut = qrcodeHandler.calQrcode(contentBytes); 
                    for (int i = 0; i < codeOut.length; i++) { 
                        for (int j = 0; j < codeOut.length; j++) { 
                            if (codeOut[j][i]) { 
                                gs.fillRect(j * 3 + pixoff, i * 3 + pixoff, 3, 3); 
                            } 
                        } 
                    } 
                } else { 
                    throw new Exception("QRCode content bytes length = " + contentBytes.length + " not in [0, 800]."); 
                } 
                gs.dispose(); 
                bufImg.flush(); 
            } catch (Exception e) { 
                e.printStackTrace(); 
            } 
            return bufImg; 
        } 

    2.扫码二维码下载APP实现

    针对android 只需要返回app安装包的地址就OK

    针对ios 需要跳转到网页,网页点击安装,在线直接安装ipa


    如何判断扫码的手机类型?

     if (!Tools.isEmpty(UserAgentStr)) {
        UserAgentStr = UserAgentStr.toLowerCase();
        int isIPhone = UserAgentStr.indexOf("iphone os");
        int isAndroid = UserAgentStr.indexOf("android");
        if (isIPhone >= 0) {
         type= "ios";
        }
        if (isAndroid >= 0) {
         type= "android";
        }
       }

    实现跳转的Jsp   downloadurl = https://192.168.34.92/resource_drive/appDownload/ios/d.plist

    <script type="text/javascript">
    var type = "${type}";
    if(type == "android"){
      window.location.href="${downloadurl}";
    }
    </script>

    <body>

     <a href="itms-services://?action=download-manifest&url=${downloadurl}" class="testbutton">一键安装云网盘iPhone版</a>

    </body>

    这个d.plist参考地址:http://blog.163.com/it_kidworkroom/blog/static/1247284832014101310511727/

    特别注意地方

    在IOS7系统之前,请求是http,之后必须采用https(这个坑了不少时间)

    https又设计到, 服务器的证书和ios.ipa的证书






    展开全文
  • 我设置的二维码扫了之后的连接时项目中的 xxx.apk 但是扫码之后显示的却是字符串。。怎么扫码之后就直接下载?
  • Custom-scanCode-for-uni-app uni-app中h5+自定义二维码扫码界面
  • 使用全Delphi代码实现的二维码扫码程序,静态库方式调用,实现代码简单、方便,扫码过程不卡顿。(请注意,只适应安卓使用)
  • uni-app 中应用H5+自定义二维码扫码界面

    万次阅读 热门讨论 2019-05-06 15:38:07
    前段时间因项目需求,要在uni-app扫码uni.scanCode(OBJECT),中并没有自定的参数或者接口,所以自己用H5+搞了个扫码界面,这里做一下记录,就算是一个轮子。 下面开始造轮子。 1,创建一个.vue的页面文件。因为...

    前段时间因项目需求,要在uni-app的扫码uni.scanCode(OBJECT),中并没有自定的参数或者接口,所以自己用H5+搞了个扫码界面,这里做一下记录,就算是一个轮子。

    下面开始造轮子。

    1,创建一个.vue的页面文件。因为我这需求是全屏的扫码,所以在pages.json 中设置去掉原生导航栏

    2,开始在页面中绘制界面

    如图我们看到有内容,返回箭头,标题,提示文本信息,扫码框,打开手电动按钮等内容,

    虽然看上去是有这5部分,但是我们可以认为是二维码一层,文字及操作按钮是一层,

    A.二维码层创建

    // 创建二维码窗口
                createBarcode(currentWebview) {
                    barcode = plus.barcode.create('barcode', [plus.barcode.QR], {
                        top: '0',
                        left: '0',
                        width: '100%',
                        height: '100%',
                        scanbarColor: '#1DA7FF',
                        position: 'static',
                        frameColor: '#1DA7FF'
                    });
                    barcode.onmarked = this.onmarked;
                    barcode.setFlash(this.flash);
                    currentWebview.append(barcode);
                    barcode.start();
                }

    // 扫码成功回调
                onmarked(type, result) {
                    var text = '未知: ';
                    switch (type) {
                        case plus.barcode.QR:
                            text = 'QR: ';
                            break;
                        case plus.barcode.EAN13:
                            text = 'EAN13: ';
                            break;
                        case plus.barcode.EAN8:
                            text = 'EAN8: ';
                            break;
                    }
                    plus.navigator.setFullscreen(false);
                    uni.navigateBack({
                        delta: 1
                    });
                    this.$eventHub.$emit(this.type, {
                        result: result
                    });
                    barcode.close();
                }

    // 创建操作按钮及tips
                createView(currentWebview) {
                    // 创建返回原生按钮
                    var backVew = new plus.nativeObj.View('backVew', {
                            top: '0px',
                            left: '0px',
                            height: '40px',
                            width: '100%'
                        },
                        [{
                            tag: 'img',
                            id: 'backBar',
                            src: 'static/backBar.png',
                            position: {
                                top: '2px',
                                left: '3px',
                                width: '35px',
                                height: '35px'
                            }
                        }]);
                    // 创建打开手电筒的按钮
                    var scanBarVew = new plus.nativeObj.View('scanBarVew', {
                            top: '60%',
                            left: '40%',
                            height: '10%',
                            width: '20%'

                        },
                        [{
                                tag: 'img',
                                id: 'scanBar',
                                src: 'static/scanBar.png',
                                position: {
                                    width: '28%',
                                    left: '36%',
                                    height: '30%'
                                }
                            },
                            {
                                tag: 'font',
                                id: 'font',
                                text: '轻触照亮',
                                textStyles: {
                                    size: '10px',
                                    color: '#ffffff'
                                },
                                position: {
                                    width: '80%',
                                    left: '10%'
                                }
                            }
                        ]);
                    // 创建展示类内容组件
                    var content = new plus.nativeObj.View('content', {
                            top: '0px',
                            left: '0px',
                            height: '100%',
                            width: '100%'

                        },
                        [{
                                tag: 'font',
                                id: 'scanTitle',
                                text: '扫码',
                                textStyles: {
                                    size: '18px',
                                    color: '#ffffff'
                                },
                                position: {
                                    top: '0px',
                                    left: '0px',
                                    width: '100%',
                                    height: '40px'
                                }
                            },
                            {
                                tag: 'font',
                                id: 'scanTips',
                                text: this.name,
                                textStyles: {
                                    size: '14px',
                                    color: '#ffffff',
                                    whiteSpace: 'normal'
                                },
                                position: {
                                    top: '90px',
                                    left: '10%',
                                    width: '80%',
                                    height: 'wrap_content'

                                }
                            }

                        ]);
                    backVew.interceptTouchEvent(true);
                    scanBarVew.interceptTouchEvent(true);
                    currentWebview.append(content);
                    currentWebview.append(scanBarVew);
                    currentWebview.append(backVew);

    backVew.addEventListener("click", function(e) { //返回按钮
                        uni.navigateBack({
                            delta: 1
                        });
                        barcode.close();
                        plus.navigator.setFullscreen(false);

                    }, false);

        var temp = this;
                    scanBarVew.addEventListener("click", function(e) { //点亮手电筒
                        temp.flash = !temp.flash;
                        if (temp.flash) {
                            scanBarVew.draw([{
                                    tag: 'img',
                                    id: 'scanBar',
                                    src: 'static/yellow-scanBar.png',
                                    position: {
                                        width: '28%',
                                        left: '36%',
                                        height: '30%'
                                    }
                                },
                                {
                                    tag: 'font',
                                    id: 'font',
                                    text: '轻触照亮',
                                    textStyles: {
                                        size: '10px',
                                        color: '#ffffff'
                                    },
                                    position: {
                                        width: '80%',
                                        left: '10%'
                                    }
                                }
                            ]);
                        } else {
                            scanBarVew.draw([{
                                    tag: 'img',
                                    id: 'scanBar',
                                    src: 'static/scanBar.png',
                                    position: {
                                        width: '28%',
                                        left: '36%',
                                        height: '30%'
                                    }
                                },
                                {
                                    tag: 'font',
                                    id: 'font',
                                    text: '轻触照亮',
                                    textStyles: {
                                        size: '10px',
                                        color: '#ffffff'
                                    },
                                    position: {
                                        width: '80%',
                                        left: '10%'
                                    }
                                }
                            ])
                        }
                        if (barcode) {
                            barcode.setFlash(temp.flash);
                        }
                    }, false)

    }

    将代码都贴出来看着比较繁琐,但是觉还是在这里记录一下,算是uni-app应用过程的学习笔记

    项目代码

     

     

    展开全文
  • 二维码扫码登陆流程

    2020-07-01 10:51:32
    二维码扫码登陆流程有web端和APP端,App扫码登陆web端扫码登陆流程请求keyAPP客户端扫码轮询查状态登录流程 有web端和APP端,App扫码登陆web端 扫码登陆流程 请求key 生成一个uuid的key返回前端 同时存入redis并...

    最近做完扫码登陆,记录一下流程;需求:有web端和APP端完整账号登陆,App扫码登陆web端

    扫码登陆流程

    在这里插入图片描述

    请求key

    生成一个uuid的key返回前端 同时存入redis并初始状态为 0 ,失效时间为三分钟
    value 逗号分隔 前面表示状态 (0-未扫码,1-已扫码,2-已登陆)
    逗号后面随便放个值,等确认登陆后存用户账号 (手机号)

    @ApiOperation(value = "获取二维码登陆初始key")
    	@PostMapping("/getQrKey")
    	public R getQrKey() {
    		log.info("获取二维码登陆初始key");
    		try {
    			ValueOperations<String, String> opsForValue = strRedisTemplate.opsForValue();
    			String key = IdUtil.simpleUUID();
    			//key - value      value  逗号分隔  前面表示状态 (0-未扫码,1-已扫码,2-已登陆) 后面表示userId
    			opsForValue.set(CommonConstants.QR_REDIS_HEAR + ":" + key, "0,0", 180, TimeUnit.SECONDS);
    			QrCodeResultVo build = QrCodeResultVo.builder().type("0").key(key).build();
    			return new R(build);
    		} catch (Exception e) {
    			log.error("获取二维码登陆初始key失败", e);
    			return R.error("获取二维码登陆初始key失败", e);
    		}
    	}
    

    APP客户端扫码

    APP客户端扫码后,修改对应key的状态
    如果状态要修改为2 则在redis存入value时 将用户的账号(手机号)拼接在后面

    	@ApiOperation(value = "更新key的状态")
    	@ApiImplicitParams({
    		@ApiImplicitParam(paramType = "query", name = "key", dataType = "String", required = true, value = "key"),
    		@ApiImplicitParam(paramType = "query", name = "status", dataType = "String", required = true, value = "status")
    	})
    	@PostMapping("/updateQrStatus")
    	public R updateQrStatus(@RequestParam(name = "key", required = false) String key,
    							@RequestParam(name = "status", required = false) String status) {
    		log.info("更新key的状态,key = {} ,status = {}", key, status);
    		try {
    			VillcloudUser user = SecurityUtils.getUser();
    			ValueOperations<String, String> opsForValue = strRedisTemplate.opsForValue();
    			//key - value      value  逗号分隔  前面表示状态 (0-未扫码,1-已扫码,2-已登陆,3-已过期) 后面表示phone
    			String value = opsForValue.get(CommonConstants.QR_REDIS_HEAR + ":" + key);
    			HashMap<String, String> map = new HashMap<>();
    			if (StrUtil.isBlank(value)) {
    				//不存在表示已超时
    				map.put("status", "3");
    				return new R(map);
    			} else {
    				//存在  则修改对应的状态
    				String[] split = value.split(",");
    				if ("1".equals(status)) {
    					opsForValue.set(CommonConstants.QR_REDIS_HEAR + ":" + key, status + "," + split[1], 180, TimeUnit.SECONDS);
    				} else if ("2".equals(status)) {
    					opsForValue.set(CommonConstants.QR_REDIS_HEAR + ":" + key, status + "," + user.getPhone(), 180, TimeUnit.SECONDS);
    				}
    				map.put("status", status);
    			}
    			return new R(map);
    		} catch (Exception e) {
    			log.error("更新key的状态失败", e);
    			return R.error("更新key的状态失败", e);
    		}
    	}
    

    轮询查状态

    前端拿到key之后 转换成二维码 同时定时轮询向后台请求 key对应的状态 不停刷新 直到状态为 2 (已登录)或者 3(已过期)

    	@ApiOperation(value = "获取扫码状态")
    	@ApiImplicitParams({
    		@ApiImplicitParam(paramType = "query", name = "key", dataType = "String", required = true, value = "key")
    	})
    	@PostMapping("/getQrStatus")
    	public R getQrStatus(@RequestParam(name = "key", required = false) String key) {
    		log.info("获取key的状态,key = {}", key);
    		try {
    			VillcloudUser user = SecurityUtils.getUser();
    			ValueOperations<String, String> opsForValue = strRedisTemplate.opsForValue();
    			//key - value      value  逗号分隔  前面表示状态 (0-未扫码,1-已扫码,2-已登陆,3-已过期) 后面表示phone
    			String value = opsForValue.get(CommonConstants.QR_REDIS_HEAR + ":" + key);
    			HashMap<String, String> map = new HashMap<>();
    			if (StrUtil.isBlank(value)) {
    				//不存在表示已超时
    				map.put("status", "3");
    				return new R(map);
    			} else {
    				//存在  则返回对应的状态和token
    				String[] split = value.split(",");
    				map.put("status", split[0]);
    			}
    			return new R(map);
    		} catch (Exception e) {
    			log.error("获取扫码登录扫码状态失败", e);
    			return R.error("获取扫码登录扫码状态失败", e);
    		}
    	}
    

    登录流程

    如果返回的状态为2 则走登录流程

    在这里插入图片描述

    在这里插入图片描述

    展开全文
  • App实现二维码扫码的功能

    千次阅读 2020-08-24 14:15:52
    转载简书上面写的非常仔细的一个博主(点击)
    展开全文
  • 功能主要应用于线下推广统计、地推人员考核下载数量、二维码统计关注度、广告水牌扫码统计、公交站台关注统计、地铁站台扫码统计、实物产品贴纸关注统计、Xinstall推广二维码、Xinstall扫码统计等场景;使用Xinstall...
  • 二维码扫码变形处理

    2020-11-03 12:13:39
    android 二维码扫码变形处理 添加依赖(谷歌早期推出的新容器布局) implementation 'com.android.support.constraint:constraint-layout:1.1.3' 修改扫码界面布局 <?xml version="1.0" encoding="utf-8"?> ...
  • 完美适应各平台(包括移动平台)的二维码插件,屏幕旋转自动适应,可以自定义扫码界面
  • 京东二维码扫码登录源码,作者开源的时候,只弄了个源码调用模块,模块我给他反编译出来了,需要用到的朋友,也可以自己反编译看下模块源码。
  • APP端扫描二维码,获取二维码内容; APP端验证二维码是否过期/无效; 如果二维码有效,展示确认登录/取消按钮; APP端携带登录信息token确认登陆; 后端为code绑定登录信息(token,userName),网页端轮询获得登录成功信息. ...
  • camera二维码扫码实例

    2018-11-19 10:02:22
    随着二维码的广泛应用,APP开发中,也越来越多的需求需要用到二维码的扫描功能,以下就针对h5+的二维码扫描功能做一些简单的介绍。
  • 二维码扫码优化

    千次阅读 2017-10-20 15:21:45
    1. 二维码扫码库介绍 二维码又称QR Code,QR全称Quick Response,是一个近几年来移动设备上超流行的一种编码方式,它比传统的Bar Code条形码能存更多的信息,也能表示更多的数据类型。 二维条码/二维码(2-...
  • QRCodeLogin 二维码扫码登录;服务器端、网页端、移动端源码;
  • 二维码扫码支付原理

    千次阅读 2019-09-26 18:28:29
    平常我们在购物付款时,使用手机中的微信或支付宝扫一扫即可完成支付,无需像以前携带现金等...线下所有的扫码支付都是以扫二维码开始,通过扫描二维码,我们可以看到付款页面商家的名称,所以二维码在这里承担的角...
  • python(django) 支付宝当面支付(二维码 扫码支付) 代码中一个django 的例子 生成rsa key,在控制台中执行命令,在当前文件夹下生成文件: openssl genrsa -out app_private_key.pem 1024 #生成私钥 openssl rsa ...
  • SCAN APP
  • 二维码扫码功能对于现在的iOS App开发来说是非常重要的。 通常为了节省开发时间,很多开发者会采用ZXing和ZBar等第三方SDK进行开发。 这样的好处是快速便捷,但是缺点也是在于如果要自定义一部分功能,可能对源码...
  • 二维码扫码登录是什么原理 在日常生活中,二维码出现在很多场景,比如超市支付、系统登录、应用下载等等。了解二维码的原理,可以为技术人员在技术选型时提供新的思路。对于非技术人员呢,除了解惑,还可以引导他更...
  • Android二维码扫码集成:GitHub地址 1.GitHub上面下载会很慢,可以点我上传的zxing模块来来下载,需要1点积分。 2.下载下来之后解压,在你的项目中file → new → import module 将该文件夹导入项目,并将app依赖于...
  • 二维码扫码数据埋点

    2018-11-17 19:37:00
    前台为商品扫码数据埋点(二维码中的链接是外链,不是自己的后台),如果直接放外链的话,是统计不到数据的,所以需要先请求到自己后台,然后重定向外链。2. 二维码中链接如果太长,二维码的点会很多,手机扫码识别...
  • 二维码扫码跳转&页面重定向

    万次阅读 2018-04-28 10:25:42
    本质:手机app扫码本质是访问二维码携带对应链接。 部分app对相关二维码可以定制一定的规范,比如用丰*App扫定制二维码,会打开对应微服务(H5)指定页面 url中的参数携带特殊符号需要encode加密处理。 踩过的坑 ...
  • 一个二维码扫码下载两种平台app

    万次阅读 2015-09-25 17:03:16
    手机APP下载 页面跳转中,请稍后…… var browser = { versions: function () { var u = navigator.userAgent, app = navigator.appVersion; ret
  • uniapp中应用H5自定义二维码扫码界面

    千次阅读 2020-09-10 15:48:17
    uniapp中应用H5自定义二维码扫码界面最终效果pages配置组件代码 最终效果 pages配置 { "path": "components/barcode/scan-page", "style": { "navigationBarTitleText": "扫一扫" } } 组件代码 <template&...
  • 二维码app扫码下载

    千次阅读 2019-09-25 11:40:52
    文章目录二维码基本原理二级码生成在线二维码生成java代码生成二维码前端二维码生成app扫码下载 二维码基本原理 参考: https://cli.im/help/48235 二维条码是指在一维条码的基础上扩展出另一维具有可读性的条码,...
  • 基于浏览器实现二维码扫码增强版-带视频演示Safari浏览器亲测效果基于H5流媒体,调用手机摄像头实现扫码基于URL Scheme,调用第三方APP实现扫码 模拟app扫码效果,支持前置摄像头后置摄像头切换,纯js+h5+css3实现,...
  • 以前写过一篇设置微信二维码失效时间的博客,最近又要新增微信退款的功能,于是又重新整理了一下前面的微信二维码扫码支付功能,感觉整体的实现方式都能够掌控了,于是将具体的源码拿出来分享一下。 开发之前,一定...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 16,874
精华内容 6,749
关键字:

二维码扫码器app