背景

公司同事身处不同省份,都需要访问一个甲方的系统,登录系统需要短信验证码。手机在技术手上,经常打断工作去看验证码实在是影响工作效率,因此结合前面开发的QQ机器人,结合APP实现转发短信到服务器,再由QQ机器人发到群里的功能。

前提

公网IP
非鸿蒙系统(实现方式不同)
安卓版本低于8.0(API 26)(对静态广播有限制)

目前发现的问题

APP退出时间长了以后收不到静态广播,推测是被回收掉了。
傻瓜式解决方案:APP置于前台不退出
根源式解决方案:进程保活

技术实现

BroadcastReceiver + socket + python
因为是给QQ机器人接入的新功能,所以采用socket的方式。
换个思路也可以做一个API,接收到短信以后保存到数据库里,通过python定时访问数据库检查是否有新的短信,有就发出来。考虑到验证码的时效性,这个查询的周期会比较短,一个程序定时高频率操作数据库感觉不够奈斯。

代码

Android部分

main.class随便写写就行了,反正也不用。

SmsRecevier.class
静态注册一个BroadcastReceiver,监听短信广播,然后通过socket发送给服务器。
静态注册的广播,APP退出以后会继续工作。

public class SmsRecevier extends BroadcastReceiver {@Overridepublic void onReceive(Context context, Intent intent) {Bundle bundle = intent.getExtras();//通过getExtras()方法获取短信内容if (bundle != null) {Object[] pdus = (Object[]) bundle.get("pdus");//通过关键词“pdus”从Bundle实例中获取到短信字节数组—pdusif (pdus == null) {return;}SmsMessage[] messages = new SmsMessage[pdus.length];//把短信字节数组—pdus转换进->SmsMessage[]for (int i = 0; i < messages.length; i++) {if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {String format = bundle.getString("format");messages[i] = SmsMessage.createFromPdu((byte[]) pdus[i], format);} else {messages[i] = SmsMessage.createFromPdu((byte[]) pdus[i]);}try {String msgStr = messages[i].getMessageBody();//短信内容SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");String t1 =simpleDateFormat.format(new Date(messages[i].getTimestampMillis())) //发送时间String s1 =messages[i].getOriginatingAddress()) //发件人手机号transport(msgStr);}} catch (Exception e) {e.printStackTrace();}}}}private void transport(String m) {final String message = m + "\r\n";//数据的结尾加上换行符才可让服务器端的readline()停止阻塞try {new Thread() {@Overridepublic void run() {try {String host = "1.2.3.4";int port = 1234;Socket socket = new Socket(host, port);if (socket.isConnected()) {OutputStream outputStream = socket.getOutputStream();outputStream.write(message.getBytes("UTF-8"));outputStream.flush();outputStream.close();socket.close();}} catch (Exception e) {e.printStackTrace();}super.run();}}.start();} catch (Exception e) {e.printStackTrace();}}
}

AndroidManifest.xml
添加权限和静态注册广播

    <uses-permission android:name="android.permission.INTERNET" /><uses-permission android:name="android.permission.CHANGE_WIFI_STATE"></uses-permission><uses-permission android:name="android.permission.ACCESS_WIFI_STATE"></uses-permission><uses-permission android:name="android.permission.CHANGE_NETWORK_STATE"></uses-permission><uses-permission android:name="android.permission.ACCESS_NETWORK_STATE"></uses-permission><uses-permission android:name="android.permission.RECEIVE_SMS"></uses-permission><application…………<receiver android:name="com.xxx.SmsRecevier"  android:exported="true"><intent-filter><action android:name="android.provider.Telephony.SMS_RECEIVED"/><action android:name="android.intent.action.INPUT_METHOD_CHANGED" /></intent-filter></receiver></application>

这条权限不能少,没有这个权限无法读取信息内容:

<uses-permission android:name="android.permission.RECEIVE_SMS"></uses-permission>

pythton部分

和python+go-cqhttp搭建自动回复QQ机器人中的自动回复部分差不多,只是如果手机和服务器不在同一个局域网下,那么服务器上的socket监听的IP地址要写成服务器的公网地址,和BroadcastReceiversocket发送消息的IP地址一样。

Android转发短信给QQ机器人相关推荐

  1. android 转发短信

    通过这些代码也可以对远程手机实现短信控制.有兴趣的可以自己改一下,说一下简单的原理,要实现控制的话,必须得走一个固定的号码,固定的格式,然后通过得到此号码的内容,然后通过固定的内容,就可以了解需要做什 ...

  2. android 短信转发设置权限,用Tasker实现Android手机短信转发到钉钉

    ​ 之前的一篇文章[<用Tasker实现Android手机短信转发到微信>](https://taskerm.com/2018/12/22/forwarded-sms-to-wechat. ...

  3. android实现短信自动转发

    我有两张手机卡,一张专门用来绑定银行卡的,一张拿来打电话用的.但是我的手机只能装一张银行卡,现在问题来了,我出门的就要带俩手机,非常麻烦.所以我就写了一个短信转发功能app,这样就可以只带一个手机出门 ...

  4. Sms开源短信及消息转发器,不仅只转发短信,备用机必备神器

    Sms开源短信及消息转发器,不仅只转发短信,备用机必备神器. 短信转发器--不仅只转发短信,备用机必备神器! 监控Android手机短信.来电.APP通知,并根据指定规则转发到其他手机:钉钉群自定义机 ...

  5. 自动转发短信安卓转iOS

    安装软件 配置 安卓安装<短信转发器> 下载地址(如果某个链接不能用,就试试别的) 短信转发器 Github:https://github.com/pppscn/SmsForwarder ...

  6. Android之——短信的备份与还原

    转载请注明出处:http://blog.csdn.net/l1028386804/article/details/47091281 眼下,Android手机中的一些软件能够实现手机短信的备份与还原操作 ...

  7. android 获取短信验证码倒计时

     android 获取短信验证码倒计时 public class MainActivity extends Activity { private Button submit;     privat ...

  8. android发送短信

    使用android发送短信,需要先进行添加发送,读取短信新的权限: <uses-permissionandroid:name="android.permission.RECEIVE_S ...

  9. Android接收短信-createFromPdu

    createFromPdu(byte[]) method was deprecated in API level 23. Use createFromPdu(byte[], String) inste ...

最新文章

  1. 一步一步自定义spinner
  2. Team Work(CF 932 E)[bzoj5093][Lydsy1711月赛]图的价值
  3. oracle的iw算法,[转载]Oracle日期周详解IW
  4. excel图表交互联动_深入讲解EasyShu图表与引用数据动态联动功能
  5. android 页面整体滑动,ScrollView 实现页面整体滑动
  6. 这个使用 Python 编写的 PDF 神器你值得拥有!
  7. 第一章节 ASP.NET Web应用程序基础(一)
  8. 札记:android手势识别,MotionEvent
  9. 【Datawhale IntelVINO学习笔记】OpenVINO音频和人体姿态识别
  10. 使用vue实现四级联动
  11. 读懂Redis源码,我总结了这7点心得
  12. python编程中的不等于符号_python不等于符号怎么写
  13. 使用flask从零构建自动化运维平台系列三
  14. 五猴分桃问题的数学解
  15. springboot 最新腾讯云短信接入的坑(包含所有操作流程)
  16. node 文件重命名
  17. golang的panic
  18. 下载xampp之后还用下载PHP吗,PHP 下载并安装XAMPP
  19. 2. Bean Validation声明式校验方法的参数、返回值
  20. 基于GIS简单处理世界土壤数据库(HWSD)的中国土壤数据集

热门文章

  1. Particle Swarm Optimization粒子群优化算法(PSO算法)概念及实战
  2. 专利查新报告该怎么做?
  3. 独家 | 蚂蚁金服漆远首谈刚完成的AI重大突破及紧缺人才,呼吁国内多点技术性强的大会,少点网红
  4. pyqt5 登录界面界面的设计(多窗口的设计)
  5. 你不知道的JavaScript--Item5 全局变量
  6. 米酷影视6.2.8完整版(仿首涂模板+四套首页模板)
  7. ps cs3 汉化包(去掉BUG版)的补充说明~回复大人Orz!
  8. jquery 遍历json list js取得json值。
  9. Spring详细教程
  10. Direct3D 11