扫二维码下载apk并统计被扫描次数
发布时间 - 2026-01-10 22:15:55 点击率:次需求:想让用户扫描一个二维码就能下载APP,并统计被扫描次数。

两种实现方法:
1.一般我们用草料生成二维码,如果没有注册的话只能生成一个包含下载网址的静态码,没有统计功能,而且出了自己截图保存外,草料是不会保存你的二维码的。
如果注册草料后,可以选择生成活码。所谓活码,就是一个指向页面,然后通过这个指向页面,再到你的下载链接。这个指向页面内嵌了统计代码。你可以通过草料的统计功能,看你的二维码相关的扫描数据。
2.你的App下载地址,自己内嵌一个统计代码,这样来统计扫描数据,这样,你只要一个静态码就够了。不需要在草料注册,用户扫描二维码后,直接进入下载界面,没有中间的指向页面。
由于不希望自己的app投放到应用市场,因此微下载行不通。比如,把你的APK文件上传到腾讯的开放平台,申请通过后,会拿到一个移动推广链接,然后替换原来的“android下载”的链接(直接此文件生成一个二维码也行),这样用户就可以在微信中扫一扫直接下载了。
同时,一般用户用扫一扫,大多都用微信自带“扫一扫”工具,而微信打开的二维码页面,会自动屏蔽apk文件,所有显然把apk的url生成一个二维码,让用户扫一扫后就能直接下载,这样是行不通的。微信做了限制除了和微信有合作关系的应用才能使用微信扫描后直接下载apk,其他的应用只能点击微信右上角的菜单跳转到普通浏览器下载apk。
尝试:
用草料生成二维码:
“文件”方式生成二维码:上传需要下载的文件,生成二维码,扫描二维码跳转到它默认的模板页面,点击可下载该文件。但是不支持.apk这样的特殊格式。
“网址”方式生成二维码:直接将.apk的下载地址url生成二维码,扫描下载行不通。微信将其屏蔽了(QQ中的“扫一扫”功能是可以的,易信、360也都可以扫出来)。
所以最终采用第二种方法。
实现方案:
直接判断微信的ua,然后弹出一个遮罩提示用户在新的浏览器中打开下载,并且加关闭的按钮,类似于如图。
(1)在你的服务器上写一个下载详情页面,将app下载链接放上去。这里设计的是:使用JS+HTML+CSS结合的方式,用移动h5技术适配了手机版网页,不会在已进入微信就弹出提示它在新浏览器中打开,因为你还可以在这个页面里做一些提交表单查看信息等操作。只有用户点击应用下载链接才弹出遮罩提示跳转至新的浏览器下载,如图:
(2)把下载页面的URL地址,通过"草料二维码"生成一个二维码,如图:
(3)如果是在微信里扫一扫打开的,当用户点击“安卓版下载”的时候,就提示用户要在默认浏览器中打开,如图:
(4)其实扫描二维码,就是访问一个url,可以在后台统计url被访问的次数,就是扫描二维码的次数了。
贴出关键代码:
public class Counter{
private int count;
public Counter(){
this(0);
}
public Counter(int count){
this.count=count;
}
public void setCount(int count){
this.count=count;
}
public int getCount(){
return count;
}
public void add(int step){
count+=step;
}
}
/**
* 统计页面访问的次数,并在关闭应用时将其保存到文件,待下次启应用时读取次数。
* @author Joanna.Yan
*
*/
public class MyServletContextListener implements ServletContextListener{
public void contextInitialized(ServletContextEvent sce){
System.out.println("====================helloapp application is Initialized.==========");
ServletContext context=sce.getServletContext();
try{
BufferedReader reader = new BufferedReader(
new InputStreamReader(context.getResourceAsStream("/count/count.txt")));
int count = Integer.parseInt(reader.readLine());
reader.close();
Counter counter = new Counter(count);
context.setAttribute("counter",counter);
}catch(IOException e){e.printStackTrace();}
}
public void contextDestroyed(ServletContextEvent sce){
System.out.println("helloapp application is Destroyed.");
ServletContext context=sce.getServletContext();
Counter counter=(Counter)context.getAttribute("counter");
if(counter != null){
try{
String filepath = context.getRealPath("/count");
filepath = filepath+"/count.txt";
PrintWriter pw= new PrintWriter(filepath);
pw.println(counter.getCount());
pw.close();
}catch(IOException e){e.printStackTrace();};
}
}
}
web.xml中注册监听器:
<listener> <listener-class>joanna.yan.listener.MyServletContextListener</listener-class> </listener>
web.xml中注册servlet:
<servlet> <servlet-name>QRCodeServlet</servlet-name> <servlet-class>joanna.yan.servlet.QRCodeServlet</servlet-class> </servlet> <servlet-mapping> <servlet-name>QRCodeServlet</servlet-name> <url-pattern>/QRCode</url-pattern> </servlet-mapping>
public class QRCodeServlet extends HttpServlet{
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp)
throws ServletException, IOException {
doPost(req, resp);
}
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp)
throws ServletException, IOException {
System.out.println("QRCodeServlet被访问了!");
ServletContext context=getServletContext();
Counter counter=(Counter) context.getAttribute("counter");
if(counter==null){
counter=new Counter(1);
context.setAttribute("counter", counter);
}
counter.add(1);
System.out.println("被扫描的次数:"+counter.getCount());
resp.sendRedirect(""+req.getContextPath()+"/apkdownload.jsp");
}
}
设置适配移动端屏幕,禁止浏览器的缩放功能:
<meta name="viewport" content="width=device-width,initial-scale=1.0,maximum-scale=1.0">
CSS+JS:
<style type="text/css">
#weixin-tip{display:none;position:fixed;left:0;top:0;background:rgba(0,0,0,0.8);filter:alpha(opacity=80);width:100%;height:100%;z-index:100;}
#weixin-tip p{text-align:center;margin-top:10%;padding:0 5%;position:relative;}
#weixin-tip .close{color:#fff;padding:5px;font:bold 20px/24px simsun;text-shadow:0 1px 0 #ddd;position:absolute;top:0;left:5%;}
</style>
<script type="text/javascript">
var is_weixin = (function(){return navigator.userAgent.toLowerCase().indexOf('micromessenger') !== -1;})();
window.onload = function() {
var winHeight = typeof window.innerHeight != 'undefined' ? window.innerHeight : document.documentElement.clientHeight; //兼容IOS,不需要的可以去掉
var btn = document.getElementById('J_weixin');
var tip = document.getElementById('weixin-tip');
var close = document.getElementById('close');
if (is_weixin) {
btn.onclick = function(e) {
tip.style.height = winHeight + 'px'; //兼容IOS弹窗整屏
tip.style.display = 'block';
return false;
};
close.onclick = function() {
tip.style.display = 'none';
};
}
};
</script>
....你的网页代码...... <div id="weixin-tip"> <p> <img alt="微信打开" src="img/warn.png"> <span id="close" title="关闭" class="close">X</span> </p> </div>
以上就是本文的全部内容,希望本文的内容对大家的学习或者工作能带来一定的帮助,同时也希望多多支持!
# 二维码
# 扫描次数
# php生成二维码图片方法汇总
# JS生成和下载二维码的代码
# 微信 开发生成带参数的二维码的实例
# Android项目实战(二十八):使用Zxing实现二维码及优化实例
# 通过扫描二维码打开app的实现代码
# JavaScript实现的微信二维码图片生成器的示例
# 利用Java生成带有文字的二维码
# jQuery实现微信长按识别二维码功能
# php微信开发之带参数二维码的使用
# Android实现二维码扫描和生成的简单方法
# 一扫
# 如图
# 弹出
# 下载链接
# 就能
# 下载地址
# 将其
# 要在
# 器中
# 跳转
# 内嵌
# 自己的
# 的是
# 是在
# 在这个
# 出了
# 你可以
# 不需要
# 两种
# 腾讯
相关栏目:
【
网站优化151355 】
【
网络推广146373 】
【
网络技术251813 】
【
AI营销90571 】
相关推荐:
如何用y主机助手快速搭建网站?
详解CentOS6.5 安装 MySQL5.1.71的方法
Windows驱动无法加载错误解决方法_驱动签名验证失败处理步骤
青岛网站建设如何选择本地服务器?
Laravel如何实现本地化和多语言支持?(i18n教程)
Laravel怎么使用Markdown渲染文档_Laravel将Markdown内容转HTML页面展示【实战】
如何在IIS中新建站点并配置端口与IP地址?
大连 网站制作,大连天途有线官网?
Microsoft Edge如何解决网页加载问题 Edge浏览器加载问题修复
Laravel怎么实现API接口鉴权_Laravel Sanctum令牌生成与请求验证【教程】
Laravel怎么实现观察者模式Observer_Laravel模型事件监听与解耦开发【指南】
如何破解联通资金短缺导致的基站建设难题?
教你用AI润色文章,让你的文字表达更专业
韩国网站服务器搭建指南:VPS选购、域名解析与DNS配置推荐
网站制作软件有哪些,制图软件有哪些?
Laravel怎么实现微信登录_Laravel Socialite第三方登录集成
如何在企业微信快速生成手机电脑官网?
Python自然语言搜索引擎项目教程_倒排索引查询优化案例
Laravel Telescope怎么调试_使用Laravel Telescope进行应用监控与调试
制作公司内部网站有哪些,内网如何建网站?
如何用AI帮你把自己的生活经历写成一个有趣的故事?
香港服务器租用每月最低只需15元?
Laravel如何实现多对多模型关联?(Eloquent教程)
HTML 中动态设置元素 name 属性的正确语法详解
如何用搬瓦工VPS快速搭建个人网站?
Laravel如何使用Service Container和依赖注入?(代码示例)
网站制作软件免费下载安装,有哪些免费下载的软件网站?
5种Android数据存储方式汇总
Laravel模型事件有哪些_Laravel Model Event生命周期详解
如何在云主机上快速搭建多站点网站?
手机钓鱼网站怎么制作视频,怎样拦截钓鱼网站。怎么办?
javascript事件捕获机制【深入分析IE和DOM中的事件模型】
iOS发送验证码倒计时应用
如何在服务器上配置二级域名建站?
js代码实现下拉菜单【推荐】
C#如何调用原生C++ COM对象详解
Laravel如何配置和使用队列处理异步任务_Laravel队列驱动与任务分发实例
如何在 Telegram Web View(iOS)中防止键盘遮挡底部输入框
如何挑选高效建站主机与优质域名?
如何为不同团队 ID 动态生成多个非值班状态按钮
如何快速打造个性化非模板自助建站?
如何在新浪SAE免费搭建个人博客?
QQ浏览器网页版登录入口 个人中心在线进入
实例解析angularjs的filter过滤器
魔方云NAT建站如何实现端口转发?
Python结构化数据采集_字段抽取解析【教程】
,交易猫的商品怎么发布到网站上去?
HTML透明颜色代码怎么让下拉菜单透明_下拉菜单透明背景指南【技巧】
谷歌浏览器如何更改浏览器主题 Google Chrome主题设置教程
如何用手机制作网站和网页,手机移动端的网站能制作成中英双语的吗?

