All Posts

Sip语音通话

项目地址:SipVoice 该 demo 基于https://github.com/VoiSmart/pjsip-android 项目实现语音对讲对讲功能。 还有很多关于 pjsip 的功能和 API 请移步 pjsip-android。 正常运行该 Demo ,需要已有 Sip 服务端,Constants 中配置 ip 和端口。 解决了一个坑,通话2分钟必定断开,在 pjsip-android 提了 issues ,https://github.com/VoiSmart/pjsip-android/issues/89 估计他们使用的服务器不要客户端发心跳,所以一直没有找到答案,不过还是非常感谢 pjsip-android 的团队。 后面通过抓win软件的包,与同事沟通,找资料等方式,得知客户端需要主动发心跳,这才解决。

到站提醒的Demo

关于一个到站提醒的Demo 大概的实现过程是这样的: 1,保存用户输入目的地的站名和拼音,并点击开启监听按钮; 2,开启间隔定位,获取第一次信息,得到当前城市code,然后去获取这个站名的信息(经纬度); 3,继续定位获取当前的经纬度,比较与目的地的直线距离; 4,如果小于预设值,则认为是进入该预设值的范围,就停止定位,开启录音; 5,录音5秒,然后利用讯飞语音转文字,再转为拼音,与目的地的拼音进行匹配; 6,如果与目的地的拼音匹配率超过50%(比方:目的地是5个字,识别的语音有3个字是相同的,就认为是匹配上了),然后开启震动和弹出通知栏告知用户到站下车 (匹配的算法可能还有待优化,能够拼音模糊匹配就更好了) 涉及到的技术点: 1,定位,计算距离,站点信息 用的都是高德地图 2,语音识别,用的是讯飞语音 3,录音用的是 Android 的 AudioRecorder 4,汉字转拼音用的是 Android 的 HanziToPinyin Android 下录音的两个类 AudioRecorder 和 MediaRecord AudioRecord 是一个比较偏底层的API,它可以获取到一帧帧 PCM 数据;MediaRecord 录制的音频文件是经过压缩后的。 (讯飞语音文件语音转文字支持两种格式 pcm 和 wav ,wav可直接在手机播放,所以这里录音用的是 AudioRecorder 文件格式是 pcm ,后转为wav) PCM是一种没有压缩且无损的编码方式,WAV是微软开发的一种无损的音频文件格式 , 而WAV是通过PCM数据的基础上添加头部信息而生成的一种音频格式,音质与CD接近 AudioRecorder 的几个需要注意的参数设置 录音采样率设置为:1600Hz (每秒录取声音的次数) 声音来源设置为:MediaRecorder.AudioSource.VOICE_COMMUNICATION(麦克风音频源针对语音通信进行了调整,会比设置为MIC好一些) 采样位数设置为:16bit (AudioFormat.ENCODING_PCM_16BIT 每秒录取声音的精度) 声道数设置为: 单声道(MONO) 音频文件的音质比特率:(kbps)=【采样率】(kHz)×(bit采样位数)×【声道数量】 这里的录音过程是这样:录5秒,停止,开始语音识别文件,识别完成后匹配,然后再启动录音 停止录音需要注意一下, 使用 audioRecord.stop()这个方法即可 最终停止才用 audioRecord.release() 录音大概就是这样 讯飞的语音识别目前有几个问题 1,语音识别率不是太高

监听到局域网内的设备信息

项目上有个需要实现的功能, 涉及到几个设备:路由器,全景相机,手机。 路由器发出WIFI供全景相机和手机连接,手机需要拿到全景相机的IP去控制全景相机。 路由器是华为的,有个它自己的App,抓包发现了路由器下连接上的设备信息。 但是华为加密是比较严格的,请求时App端会生成一个密钥供服务端验证,除非华为将这个工具发给我,不然是行不通的,不用想华为也不会告诉我。 还好Google已经有这个功能的一套方案了 https://developer.android.com/training/connect-devices-wirelessly/nsd 试验了2K多次的开关监听,没有一次错误,还是很稳定的。 代码很简单,demo地址:https://github.com/zhanglihow/GetWifiIpDemo

java.net.BindException Address already in use bind 错误

运行Java项目时,遇到了这个报错 该错误是端口号被占用,查看你项目的端口号 application.properties —> server.port=8088 然后控制栏输入 netstat -ano 然后去任务管理器处,找到 pid=3216 的进程,kill它。 重新运行你的项目,完成。

仿知乎广告效果

先放一张知乎的广告截图: 说下我的实现吧,主要利用RecyclerView,在需要出现广告的时候,将这个item透明化,显示 ImageView 就达到这种效果了。最主要是这个RecyclerView的分隔条,用了个三方的才最终达到理想的效果。 可能还是会和原知乎有点不一样,图片广告完全没动,所以这只是好奇实现了一下。 demo地址:https://github.com/zhanglihow/ZhihuRecycler 在网上看到hongyang的实现,自定义了个IamgeView,比较接近了一些。https://github.com/hongyangAndroid/demo_rvadimage

栈和队列基础题

1,设计一个有getMin功能的栈 题目:实现一个特殊的栈,在实现栈的基本功能的基础上,再实现返回栈中的最小值 要求: 1,pop、push、getMin操作的时间复杂度都是O(1) 2,设计的栈类型可以使用现成的栈的结构 public class Stack1 { private Stack<Integer> stackMin; private Stack<Integer> stackData; public Stack1(){ stackMin=new Stack<>(); stackData=new Stack<>(); } public int getMin(){ if(stackMin.isEmpty()){ throw new RuntimeException("stack is null"); } return stackMin.peek(); } //方案一 //节省空间,pop步骤多 public void push(int newNum){ if(stackMin.isEmpty()){ stackMin.push(newNum); }else{ if(getMin()<=newNum){ stackMin.push(newNum); } } stackData.push(newNum); } public int pop(){ if(stackData.isEmpty()){ throw new RuntimeException("stack is null"); } int value=stackData.pop(); if(value==getMin()){ stackMin.pop(); } return value; } //-------------------------- //方案2 //比方案1多费空间,但省时间 public void push2(int newNum){ if(stackMin.

Python 自动识别抖音小姐姐并点赞

代码基本为原作者 tomxin7 所写,我改了一些逻辑处理和更新API。 效果 抖音经常能刷到很多高质量的视频,特别是我们使用的越多,头条的算法给我们推荐的内容越精准。**那么我们可不可以写一个小型的程序,根据自己设置的特征筛选视频并且自动点赞存入我们的收藏夹中呢?比如漂亮的小姐姐,帅气的小哥哥或者是可爱的喵星人。。。 ** 图片压缩的有点厉害 原理说明 本程序与抖音无关,主要供学习用途 1,将手机打开抖音的推荐视频界面 2,用 ADB 工具获取当前手机截图,并用 ADB 将截图 pull 上来 adb shell screencap -p /sdcard/autojump.png adb pull /sdcard/autojump.png . 3,将图片进行压缩,并调用百度人脸识别API(目前使用的是v3的API) 4,获得百度返回的数据进行判断分析 5,如果满足要求,使用ADB点赞 6,上滑切换新视频 使用教程 1、获取源码 git命令 git clone https://github.com/zhanglihow/DouYinFaceTech.git 2、依赖 Python:3.6.3 ADB下载:http://adbshell.com/downloads 依赖:pip install pillow 3、准备 使用数据线连接手机与电脑,并开启调试模式 申请百度人脸检测的Key FaceMain.py中替换token的host链接 4、运行 手机打开抖音首页 DouYinFaceTech目录下直接运行FaceMain.py 5、可能遇到的问题 1,运行py文件不成功,出现cmd后闪退,建议这样运行有错误提示 cd 项目目录 python FaceMain.py 2,检测到中意的人脸后代码执行 GetDouYinImg.py 的 click_like() 方法时,手机未能点击成功 def click_like(): os.system("adb shell input tap 950 850")#点击事件 需要对应你的手机来更改位置

Flutter--使用 Server酱 推送微信消息给个人

server酱:http://sc.ftqq.com/3.version Server酱 设计的非常简单,你只需要用 Github 账号登录,然后绑定微信同时关注公众号,就可以通过 Http 服务,向绑定的微信号发送通知消息。 发送消息只需要向以下URL发一个GET或者POST请求: https://sc.ftqq.com/[SCKEY].send 接受两个参数: text:消息标题,最长为256,必填。 desp:消息内容,最长64Kb,可空,支持MarkDown。 之前想基于 Haven ,做一个在家发现异常然后给我发通知的一个Demo,苦于邮件发送太麻烦,于是搁置了。但现在看来使用这个好像很不错。 于是用Flutter写了这样一个Demo,就当熟悉下Flutter吧。 使用到了 Flutter 的 Url跳转,Http请求,数据本地持久化SharedPreferences,及一些基础控件。 代码:https://github.com/zhanglihow/serverchan_flutter_demo ​ ​ 参考: Flutter交互控件 Flutter 网络操作 Flutter 本地存储

Java 反射与 open-sdk 来使用 Android hide 方法

一直有个问题,就是清除非本APP 连接的wifi保存的密码,很想像Android系统那样可以直接在WIFI设置那里直接取消保存,于是做了以下尝试。 是在sdk 19以上哦,19以下(包括)是可以直接清除的。 清除wifi密码比较通常的用法是: WifiManager mWifiManager = (WifiManager)getApplicationContext().getSystemService(Context.WIFI_SERVICE); mWifiManager.removeNetwork(config.networkId); mWifiManager.saveConfiguration(); 这样可以清除掉本来是你这个APP连接的WIFI,意思是这个WIFI是别人连接上的你是不能清除掉的。 目前也没有看到其他三方App能够做到这样。 于是开始寻找其他方法。 然后看到了 WifiManager 的这个方法 froget(看起来好像很有希望哦): 说的是替代 removeNetwork 和 saveConfiguration 方法,可是这是hide的,我们显式是调用不了的。 那先试试反射吧。 首先去拿到WifiManager: Class<?> clazz = null; try { clazz = Class.forName("android.net.wifi.WifiManager"); } catch (ClassNotFoundException e) { e.printStackTrace(); KLog.e(e); } 然后构造forget方法: Class<?> actionListener = null; try { actionListener = Class.forName("android.net.wifi.WifiManager$ActionListener"); } catch (ClassNotFoundException e) { e.printStackTrace(); KLog.e(e); } KLog.e("actionListener:" + actionListener); Method method = null; try { method = clazz.

打开Flutter的Demo flutter_gallery失败

如果是git 一直超时,那么科学上网后可解决,不能科学上网的就看下面。 找到目录下的 pubspec.yaml: 将 git 替换为这个 url: https://github.com/zhanglihow/gallery-assets ref: d318485f208376e06d7e330d9f191141d14722b8 像这样: 然后点击右上角的 packges get 运行成功