- 博客(117)
- 资源 (7)
- 收藏
- 关注
原创 小程序蓝牙传输二维码
有个需求:蓝牙要显示二维码,需要得到二维码的位图(点阵图、矩阵图)。实现思路:1.获得canvas的二维码图片,要求为64px乘64px2.获得二维码的图片,然后解析像素数组,获得像素的二进制状态码3.将二进制状态码转化为byte数组,然后发送给蓝牙。这里强调一点,draw方法和canvasGetImageData都是异步加载,需要通过promise来做等待处理。首先,按照网上通用的二维码生成代码实现获得二维码矩,使用qrcode.js来获得。核心代码为draw方法:.
2020-08-03 23:54:57 1056 1
原创 Android png图片彩色转黑白,透明度打印变黑色的解决方法
最近客户有个需求:需要将彩色的图片转成黑白图片用pos机的打印机打印出来。这个在实现的过程中发现个问题:从网上下载png图片,保存到本地发现透明背景变成了黑色。正确的:本地下载的:因为第一次遇到这种情况,导致搞到现在。不过总归水落石出了,我佛了。原因是下载图片将bitmap保存到本地的时候,对图片的保真度做了限制:public enum CompressFormat { JPEG (0), PNG (1), WE
2020-07-29 00:28:07 1971
原创 微信小程序实现GBK和UTF-8互转
js虽然有第三方支持的GBK工具,但是小程序没有;而我开发中又需要进行格式的转化,就依据前人的经验做了一份出来。分为两部分:Decode.js和Encode.js。分别是GBK格式的二进制文件转化为UTF-8的String和反转。import Encoder from "./encode/Encoder";import Decoder from "./encode/Decoder";//实现参考例子var message = "减肥是一件困难的事情";//UTF-8转GBKvar g
2020-07-21 22:41:44 4754 10
原创 微信小程序的setBLEMTU说明
最近在做微信小程序的蓝牙功能,连接的设备是MPOS,但是收发数据发现,如果手机端接收的数据超过20byte就无法有效收到。查询了很多资料,也尝试了抓报蓝牙的btsnoop_hci.log来进行分析,发现并没有收到notify的数据,说明手机端没有收到。网上大多数的结论是:BLE做了收发的data最大数据限制,单个数据包的默认系统最大长度是23byte(字节),超过了就会出问题【20byte的Data数据 + 3byte的蓝牙 Header】。之前微信也没有做相关的处理,其实Android本身如果做B
2020-07-02 10:44:00 6668 8
原创 Socket丢包解决对策
socket使用过程中遇到个问题:因为数据量太大,大约有2w个字节的响应数据报,之前同事代码实现的时候没有做完整的接收处理。仅使用InputStream.available()做了一次读取,然后就遇到问题了!会发现,每次读取的时候获得的长度值不固定,且均无法获得完整长度。另一方面,响应的数据报并不会告知发送的长度是多少,但是有结束标志:byte类型03是结束标志。所以做了重新:by...
2020-04-15 20:29:59 5157
原创 子线程居然可以更新UI!
一、子线程更新了UI发现了一个奇怪的情况,我在fragment初始化的时候,new了一个子线程。然后在子线程设置了一个textView的字符串,并且设置了ta的click监听事件@Override protected void init() { LogUtils.dThread("<<<<<init>>>>&g...
2020-03-24 15:38:41 576
原创 Jetpack之Navigation的学习demo
1.java版demohttps://github.com/fengjw1/NavigationDemoOfJava
2020-03-22 20:41:44 358
原创 MQTT源码解析
一、MQTT的创建和connect流程1.Android端实现mqtt,首先会new一个MqttAndroidClient,并传入需要的参数。首先,MqttAndroidClient是如何创建的呢?public MqttAndroidClient(Context context, String serverURI, String clientId, MqttClientPers...
2020-03-20 11:10:59 2144
原创 getLocationOnScreen和getLocationInWindow的区别
测试发现,大多数布局情况下,两者获得的内容是没有区别的,唯一的区别就是在window的弹框(比如dialog等)出现的情况下。其他情况下,获得的都是getLocationOnScreen的值。两者并没有区别。参考博客:https://blog.csdn.net/tmj2014/article/details/53283804...
2019-12-24 18:12:28 549
原创 viewHolder的作用
viewholder的作用是因为Android有个recycler的反复循环器,viewholder就是借助他来做到循环利用itemview。例如:默认加载10个itemview,初始化的时候创建一个viewholder,并把10个itemview加载到内存里面。接着下滑,加载5-15的item,这个时候,显示的还是只有10个view。我们只是需要重新填充view的数据,而不需要再...
2019-12-24 15:56:47 8658
原创 passcodeview的简单使用
最近做一个密码键盘,使用了GitHub的开源库,仓库地址为:https://github.com/kevalpatel2106/PasscodeView做一个类似界面,如图:passcodeview的简单使用:git clone项目到本地,查看simple demo。passcodeview支持两种:按键和画线,demo里面都有详细例子。我这里只使用了按键的部分,并且不需要指纹...
2019-12-24 14:29:37 276
原创 static和volatile的使用
1.static保证唯一性,就是在主内存中是唯一的变量。2.volatile是保证可见性,就是指在工作线程和主内存的数据的一致性,改变了工作线程中volatile修饰的变量,那么主内存也要发生更新。所以,volatile和static一起使用不矛盾。因为static修饰只能保证在主内存的唯一性,如果涉及到其他工作线程,改变参数可能就会导致static修饰的变量的内容无法同步,所以stati...
2019-12-24 11:35:09 10024 2
原创 使用GreenDao的记录(二)
GreenDao主要是考虑四个对象:DaoMaster,DaoSession,DBHelper和DBManager。1.DaoMaster主要是注册表2.DaoSession主要是做数据库的增删改查的映射,DaoSession的初始化及使用都是依赖DaoMaster。3.DBHelper作为初始化数据库的时候使用4.DBManager作为我们的主要操作类来编码。DBMan...
2019-12-24 10:11:36 199
原创 使用GreenDao数据库的记录
1.List<T>自定义数据的增加方法:写一个convert转化器,然后用FastJson的格式转化方法来处理转化问题例如:数据库的一个自定义List,叫priceArray.然后就进行转化:public static class PriceArrayBeanConvert implements PropertyConverter<List<P...
2019-12-23 16:48:27 208
原创 抽象类中的非抽象方法
抽象类的作用相当于模板其内部可以有抽象方法和非抽象方法:其中抽象方法必须被继承该抽象类的子类重写;而非抽象方法则不需要。那么,非抽象方法的目的是什么呢?重复利用。当多个子类继承同一个抽象类的时候,有些共同的属性,不需要子类特别实现的可以定义为同一个非抽象方法,使用的时候子类直接调用即可。比如抽象父类内部有个单例的非静态的非抽象方法c,有A,B两个子类都继承该类,则A和B...
2019-12-11 14:56:16 5213 1
原创 Mqtt断开连接disconnect报错原因
最近在用mqtt做及时通信,mqtt服务本身是放在本地的service服务里面运行,在应用关闭的时候,mqtt服务也要断开连接,不然会继续占用服务器的cpu,增加服务器负担。所以,在service的onDestroy中,需要调用MqttAndroidClient.disconnect()方法,但是会出现如下报错Log:Service org.eclipse.paho.android.serv...
2019-12-11 11:52:18 17581 2
原创 Android接口回调
Android自定义的接口回调主要逻辑如下:1.定义接口。例如:class interface IListener{ /** *成功状态 **/ void onSuccess(); /** *失败状态 **/ void onError();}2.设置回调的位置例如:我们在一个方法下面回调结果...
2019-12-11 08:49:32 272
原创 List数组删除数据时候的注意到
List数组在进行删除操作的时候,调用remove方法,但是remove之后会导致数据大小减1。如果我们使用for循环历遍,会存在一个问题,remove之后导致后一位因为前移而无法被历遍。所以,在进行remove的时候,不要使用for循环,使用寄存器历遍才行:代码逻辑如下://删除空数据串 Iterator<BaseBean> iterator =...
2019-12-04 21:19:41 518
原创 javax.net.ssl.SSLPeerUnverifiedException: Hostname xxx.app.xxx.com not verified:
最近遇到Hostname报错问题,使用的sslSocketFactory是网上的常规版本,所以写法是正确的。而这个问题的原因是服务器的host和本地的域名不匹配,我们看一下CA证书,例如baidu.com的证书:主要看使用者的CN和SAN的DNS是否有问题。在使用者可选名称中,一定要包含CN的域名,否则会报错,报错内容如同标题。具体原理可以参考博文:https://...
2019-12-03 12:38:11 8068
原创 Android事件分发机制
一、什么是Android事件分发机制Android事件分发机制是Android最基本的机制之一,不论是按键的事件,还是消息的事件,在Android的系统运行中,事件的分发均采用同一种思想来实现。我们这里通过分析android的按键事件分发来理解。 1.Android View的树形结构我们日常处理的部分为RootView下面的ViewGroup和View部分,那么上面的Ph...
2018-12-10 14:50:11 262
原创 ProcessList.java文件解读
package com.android.server.am;import static com.android.server.am.ActivityManagerDebugConfig.TAG_AM;import static com.android.server.am.ActivityManagerDebugConfig.TAG_WITH_CLASS_NAME;import jav...
2018-10-22 22:27:02 1496
原创 android进程生命周期和ADJ
一、进程生命周期在回收资源的时候,系统会根据进程的重要性来从低到高的回收,划分为5个级别:1.前台进程(Foreground process)2.可见进程(visible process)3.服务进程(Service process)4.后台进程(Background process)5.空进程(Empty process)重要性依次递减1.1 Foreground process...
2018-10-19 16:03:22 1154
原创 GSON格式插件:GsonFormat
一、PostmanPostman是接口测试工具,基于Chrome的插件(自备梯子)。该工具可以获取服务器的数据,发送数据到服务器获取返回结果等操作。该工具使用教程请查看文档。 我们将Postman获得的json数据通过GsonFormat工具来解析,形成Gson的数据格式类。 二、GsonFormat的安装使用 1.安装(搜索GSON就有了) ...
2018-10-18 11:05:55 610
原创 RelativeLayout属性详解
官网地址 第一类属性 属性值为true或者falseandroid:layout_centerHrizontal 水平居中android:layout_centerVertical 垂直居中android:layout_centerInparent 相对于父控件完全居中android:layout_alignParentBottom 贴紧父控件的下边缘android:l...
2018-10-18 10:33:14 42955
原创 MB/s、Mb/s、Mbps区别
1Kb = 1024bit1KB = 1024Byte1Mb = 1024Kb1MB = 1024KB 1Byte = 8 bit1MB = 8 Mb1Mb = 0.125MB 【本质:都是1Byte = 8 bit的换算】 所以换算的时候只需要知道:1MB/s = 8Mb/s = 1024KB/s...
2018-10-17 09:51:15 5725
原创 多线程之Thread、Runnable、Callable、Future、FutureTask
一、知识基础:1.Thread、Runnable、Callable:都是线程2.Thread特点:提供了线程等待(wait)、线程睡眠(sleep)、线程礼让(yield)等操作。3.Runnable和Callable特点:都是接口,并提供对应的实现方法。4.Runnable和Callable的区别:Runnable无返回值,Callable有返回值。5.Future:提...
2018-10-17 09:29:04 1099
原创 descendantFocusability用法
这个属性主要是为了解决焦点问题。两种情况:1.ListView的item有Button时,点击item无响应。2.在ScrollView时,里面包裹的内容超过了屏幕的长度,当进去scrollView直接自动滑动到最底部。 这两个问题都可以通过android:descendantFocusability属性做到。该属性在view获得焦点时,定义ViewGroup和其子控件两者之间...
2018-10-16 19:24:23 4055
原创 Git原理笔记(一)
VCS: version control system参考文档 一、底层命令(Plumbing)和高层命令(Procelain)高层命令即我们常用的那些git命令。除去这些命令,以UNIX风格使用或者由脚本调用的命令,一般称为底层命令。 我们这里主要学习底层命令。当你在一个新目录或者已经建立了git的项目内执行git init的时候,都会创建一个.git目录。几乎所...
2018-10-15 21:53:12 390
原创 Git分支相关命令
将本地分支提交到远端命令:git push origin [name]切换分支命令: git checkout [name]删除本地分支命令:git branch -d [name] 【强制删除使用大写字母D】删除远端分支命令:git push origin :branch-name或者 : git branch -r -d origin/branch-name或者 : git...
2018-10-10 14:08:42 800
原创 网络测速全解析之一:自定义View基础知识(九)
一、MotionEvent讲解:单点触控:事件 简介 ACTION_DOWN 手指 初次接触到屏幕 时触发。 ACTION_MOVE 手指 在屏幕上滑动 时触发,会多次触发。 ACTION_UP 手指 离开屏幕 时触发。 ACTION_CANCEL 事件 被上层拦截 时触发。 ACTION_OUTSIDE 手指 不在控件区域 时触发。...
2018-08-31 09:47:14 600
原创 网络测速全解析之一:自定义View基础知识(八)
一、事件分发机制详解:大佬名言:所有的源码都是为了适应具体的应用场景而写的,只要能够理解运用场景,理解源码也就十分简单了。核心问题是:正确理解在实际场景中事件分发机制的作用。 常见事件事件 简介 ACTION_DOWN 手指 初次接触到屏幕 时触发。 ACTION_MOVE 手指 在屏幕上滑动 时触发,会会多次触发。 ACTION_UP 手指...
2018-08-30 17:28:49 246
原创 网络测速全解析之一:自定义View基础知识(七)
一、自定义View的事件分发机制:1.事件分发机制的意义:view是树形结构的,而且view会重叠到一起,当我们点击某个view的时候,他可能有多个层次的view都响应。如何处理这些响应,而让我们可以更好的选择,所以有v事件的分发机制。制定一种规则来解决这些问题,让事件可以有顺序的执行起来。 ...
2018-08-30 15:01:15 206
原创 网络测速全解析之一:自定义View基础知识(六)
一、PathMeasure讲解:PathMeasure是一个用来测量Path的类,主要方法如下构造方法方法名 释义 PathMeasure() 创建一个空的PathMeasure PathMeasure(Path path, boolean forceClosed) 创建 PathMeasure 并关联一个指定的Path(Path需要已经创建完成)。 公共...
2018-08-30 11:23:20 191
原创 网络测速全解析之一:自定义View基础知识(五)
常用速查表:作用 相关方法 备注 移动起点 moveTo 移动下一次操作的起点位置 设置终点 setLastPoint 重置当前path中最后一个点位置,如果在绘制之前调用,效果和moveTo相同 连接直线 lineTo 添加上一个点到当前点之间的直线到Path 闭合路径 close 连接第一个点连接到最后一个点,形成...
2018-08-29 22:49:44 236
原创 网络测速全解析之一:自定义View基础知识(四)
一、Path之贝塞尔曲线(非常重要~)常用速查表:为了兼容性(偷懒) 本表格中去除了在API21(即安卓版本5.0)以上才添加的方法。忍不住吐槽一下,为啥看起来有些顺手就能写的重载方法要等到API21才添加上啊。宝宝此刻内心也是崩溃的。作用 相关方法 备注 移动起点 moveTo 移动下一次操作的起点位置 设置终点 setLastPoint ...
2018-08-29 21:51:36 215
原创 网络测速全解析之一:自定义View基础知识(三)
一、Path的基本操作速查表~作用 相关方法 备注 移动起点 moveTo 移动下一次操作的起点位置 设置终点 setLastPoint 重置当前path中最后一个点位置,如果在绘制之前调用,效果和moveTo相同 连接直线 lineTo 添加上一个点到当前点之间的直线到Path 闭合路径 close 连接第一个点...
2018-08-29 20:43:32 206
原创 网络测速全解析之一:自定义View基础知识(二)
一、Canvas 画布操作:画布操作的意义在于帮忙我们用更容易理解的方式做出想要的效果。(所有的画布操作都只影响后续的绘制,对之前的绘制内容没有影响)1.画布操作(1)位移(translate)translate是平移操作,基于当前点的平移一段距离;而不是基于(0,0)圆点的平移。(移动是可叠加的~)(2)缩放(scale)sx、sy是缩放比例,而px和py是控...
2018-08-29 16:55:41 197
原创 网络测速全解析之一:自定义View基础知识(一)
效果如图:整个项目的Github地址一、基础知识:基础知识,也就是最基本的自定义view需要掌握的知识,我这里主要是学习了GcsSloop大佬的view自定义系列博客(这里是博客地址)1.自定义view绘制流程调用链2.android自定义坐标系(向右向下为正)所以屏幕显示部分坐标系如下:子控件和父控件的关系:MotionEvent中:get...
2018-08-27 22:53:24 460
原创 Android源码 更改系统音量
一、Android音量按键的传递流程:android的音量按键属于系统级的按键响应,起始位置位于PhoneWindow.java的按键监听位置,如下图:KEYCODE_VOLUME_UP,KEYCODE_VOLUME_DOWN和LEYCODE_VOLUME_MUTE分别为音量+、音量-和静音;direction是一个标志位,调整的方向和类型。设置好direction之后会调用M...
2018-08-13 11:47:33 6324
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人