• 短信权限
  • 自动填写短信验证码
    • 动态注册广播
    • 静态注册广播
    • 短信广播
    • 取消注册广播
  • 获取手机短信收件箱列表
  • 运行时权限
  • 获取本机号码

短信权限

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

自动填写短信验证码

以下代码测试环境为:
Android模拟器:5.0(因为模拟器发送短信方便快捷)
Android Studio:2.2.2
代码主要借鉴于这里

注册短信广播分为动态注册(即Java代码中register)和静态注册(即配置文件Manifest.xml中配置receiver),效果一样。

动态注册广播

private void registSmsReciver() {IntentFilter filter = new IntentFilter();filter.addAction("android.provider.Telephony.SMS_RECEIVED");// 设置优先级 不然监听不到短信filter.setPriority(1000);Snackbar.make(editText,"注册短信广播", Snackbar.LENGTH_LONG).show();Log.d("TAG", "registSmsReciver     ");registerReceiver(smsReciver, filter);}

静态注册广播

        <receiver android:name=".SmsReciver"><intent-filter android:priority="1000"><action android:name="android.provider.Telephony.SMS_RECEIVED"/></intent-filter></receiver>

短信广播

    public class SmsReciver extends BroadcastReceiver {@Overridepublic void onReceive(Context context, Intent intent) {Object[] objs = (Object[]) intent.getExtras().get("pdus");for (Object obj : objs) {byte[] pdu = (byte[]) obj;SmsMessage sms = SmsMessage.createFromPdu(pdu);// 短信的内容String message = sms.getMessageBody();Log.d("TAG", "message=" + message);// 短信的发送方String from = sms.getOriginatingAddress();Log.d("TAG", "from=" + from);analysisVerify(message);}}/*** 解析短信并且回写,主要是提取出数字验证码并显示在输入框上** @param message*/private void analysisVerify(String message) {char[] msgs = message.toCharArray();StringBuffer sb = new StringBuffer();for (int i = 0; i < msgs.length; i++) {if ('0' <= msgs[i] && msgs[i] <= '9') {sb.append(msgs[i]);}}editText.setText(sb.toString());}}

取消注册广播

    @Overrideprotected void onDestroy() {super.onDestroy();// 取消短信广播注册if (smsReciver != null) {unregisterReceiver(smsReciver);smsReciver = null;}}

获取手机短信收件箱列表

以下代码从这里搬运

    public String getSmsInPhone() {final String SMS_URI_ALL = "content://sms/";final String SMS_URI_INBOX = "content://sms/inbox";final String SMS_URI_SEND = "content://sms/sent";final String SMS_URI_DRAFT = "content://sms/draft";final String SMS_URI_OUTBOX = "content://sms/outbox";final String SMS_URI_FAILED = "content://sms/failed";final String SMS_URI_QUEUED = "content://sms/queued";StringBuilder smsBuilder = new StringBuilder();try {Uri uri = Uri.parse(SMS_URI_INBOX);String[] projection = new String[] { "_id", "address", "person", "body", "date", "type" };Cursor cur = getContentResolver().query(uri, projection, null, null, "date desc");      // 获取手机内部短信if (cur.moveToFirst()) {int index_Address = cur.getColumnIndex("address");int index_Person = cur.getColumnIndex("person");int index_Body = cur.getColumnIndex("body");int index_Date = cur.getColumnIndex("date");int index_Type = cur.getColumnIndex("type");do {String strAddress = cur.getString(index_Address);int intPerson = cur.getInt(index_Person);String strbody = cur.getString(index_Body);long longDate = cur.getLong(index_Date);int intType = cur.getInt(index_Type);SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd hh:mm:ss");Date d = new Date(longDate);String strDate = dateFormat.format(d);String strType = "";if (intType == 1) {strType = "接收";} else if (intType == 2) {strType = "发送";} else {strType = "null";}smsBuilder.append("[ ");smsBuilder.append(strAddress + ", ");smsBuilder.append(intPerson + ", ");smsBuilder.append(strbody + ", ");smsBuilder.append(strDate + ", ");smsBuilder.append(strType);smsBuilder.append(" ]\n\n");} while (cur.moveToNext());if (!cur.isClosed()) {cur.close();cur = null;}} else {smsBuilder.append("no result!");} // end ifsmsBuilder.append("getSmsInPhone has executed!");} catch (SQLiteException ex) {LogUtil.d("TAG", ex.getMessage());}return smsBuilder.toString();}

运行时权限

google在6.0以后加入了运行时权限,就是说有些危险权限是在触发这些相关操作时会弹出对话框让用户来选择是否允许,比如打电话或者发短信这类涉及到资费的权限等。

危险权限包括以下几大分类:

1,日历:读取,写入
2,摄像头
3,联系人:读取,写入,获取帐户
4,位置
5,录音
6,手机状态:拨打电话,读取通话记录等
7,传感器
8,短信
9,存储卡读写

涉及到以上这些权限时,开发者就只能去改代码了,如果不改的话,相关功能则在6.0以后就无法使用了。。。

至于怎么改,以下代码来源于第一行代码第二版,郭神在12.27号的直播中又提供了三种更好的方法,大家可以参考直播视频回放
首先判断用户是否已经对该权限授权过,没有则弹框提示,有的话直接进行操作

 if (ContextCompat.checkSelfPermission(SmsCodeActivity.this, android.Manifest.permission.RECEIVE_SMS) != PackageManager.PERMISSION_GRANTED) {ActivityCompat.requestPermissions(SmsCodeActivity.this, new String[]{Manifest.permission.RECEIVE_SMS}, 1);} else {// 原来的敏感操作代码:发短信或者收短信}

然后就是对弹框操作的回调

    @Overridepublic void onRequestPermissionsResult(int requestCode, String[] permissions, int[] grantResults) {super.onRequestPermissionsResult(requestCode, permissions, grantResults);switch (requestCode) {case 1:if (grantResults.length > 0 && grantResults[0] == PackageManager.PERMISSION_GRANTED) {// 原来的敏感操作代码:发短信或者收短信} else {Snackbar.make(editText, "你拒绝了该权限", Snackbar.LENGTH_LONG).show();}break;}}

获取本机号码

通用方法一,此方法的前提是相应运营商的sim卡上必须存着号码才行,否则只能取空:

 TelephonyManager tm =(TelephonyManager)getSystemService(Context.TELEPHONY_SERVICE);String number = tm.getLine1Number();String simSerialNumber = tm.getSimSerialNumber();String imei = tm.getDeviceId();Log.i("TAG","n"+number+"s"+simSerialNumber+"i"+imei);

不靠谱方法二:可通过facebook api或者whatsapp api等类似的api可以获取
不靠谱方法三:偷偷发短信给10086或者10010然后拦截短信截取其中的本机号码

总之一句话,为了安全起见,开发者是无法正常的获取用户的本机号码的。

Android关于短信广播及权限的研究相关推荐

  1. android 发送短信 广播 demo,向Android模拟器打电话发短信的简单方法

    在开发android应用程序时,有时候需要测试一下向android手机拨打电话发送短信时该应用程序的反应.譬如编写一个广播接收器,来提示用户有短信收到或者处理短信,就需要向该手机发送短信来进行测试.这 ...

  2. 小米手机收不到短信广播之原因

    Android课题是手机远程监控 用到了服务和广播,监听短信采用的是短信广播接收器.代码写好后,在手机模拟器上是可以运行的. 但是到了小米手机真机调试,就死活接收不到短信广播,愁了好几天.各种搜索,调 ...

  3. Android 实现短信接收监听--(短信动态权限添加)

    Android 短信接收监听的两种方式,由于Android6.0后很多权限需要动态添加,所以本demo首先要解决的问题是如何添加短信的动态权限,本想把代码贴出来,想想反正要把demo发出来这里不贴代码 ...

  4. android 收不到短信广播,android – 短信广播接收器没有得到textmessage

    我做了什么 大家好,我正在创建一个短信广播接收器,我刚刚用本教程建立了一个:Broadcasttutorial.在我完成代码之后,我更新了我的Manifest.之后我将短信从我的另一部手机发送到我的手 ...

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

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

  6. android 转发短信

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

  7. Android接收短信和发送短信

    一.布局 <?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android ...

  8. android 获取短信消息,Android开发获取短信的内容并截取短信

    Android 首先我们要写一个广播接收器,当我们的手机收到短信时,系统会自动发送一个广播,我们只需要接收到这条广播就可以了 在广播里面,我们重写的onReceive()方法,通过里面的Intent写 ...

  9. 【Android】短信应用——短信截获

    之前写过一篇关于短信截获的文章,通过注册 BroadcastReceive 来获取短信信息. 但是我发现,当装了飞信,360手机安全卫士等同样有截获短信功能的程序后,我自己的程序就截获不到短信了:而且 ...

  10. Android转发短信给QQ机器人

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

最新文章

  1. 人群场景的属性--Deeply Learned Attributes for Crowded Scene Understandin
  2. Git常见疑难解答集锦
  3. Spring 5.0 源码编译, 403, 404 依赖pom 无法下载问题
  4. 分享9个最棒的代码片段资源网站
  5. centos7 iptables 端口转发 保存_iptables 防火墙
  6. oracle备份与恢复 exp,Oracle数据库备份与恢复之一:exp/imp(导出与导入装库与卸库)...
  7. Python学习笔记--6.2 文件读写
  8. Cadence Allegro PCB如何快速查找元器件
  9. kernel中的日志打印
  10. 游戏盾是什么/为什么app会被攻击
  11. JavaScript中文与阿拉伯数字互相转换
  12. 用unity开发贪吃蛇,勾起我童年乐趣的小游戏
  13. 阿里云狂揽国际朋友圈,集体融入数字中国新时代
  14. 小菜鸡的Three.js学习笔记(一)-三维模型压缩DRACO初探
  15. python椭圆特征识别_opencv python中的椭圆检测
  16. VK1621是段码LCD液晶显示屏驱动IC,具省电模式,替代市面上1621 LQFP44/48、SSOP48、DICE,最大支持32*4点阵 FAE技术支持
  17. nmap与zmap的使用
  18. 平板电脑 android系统升级,【重磅升级】开源平板电脑(FSPAD-733)升级至Andriod6.0系统...
  19. 【聆听】泰戈尔诗集(六)
  20. 如何制作MacOS系统启动盘

热门文章

  1. 计算机岗位面试专业技术测试,浙江广电计算机岗的笔试题目和面经分享
  2. splunk-(UF)通用转发器
  3. HDU1426 Sudoku Killer(dfs)[C++]
  4. Office 2007 PIA Demo
  5. 【故事编程:线程锁及数据准备】之魔法杂货店(一)
  6. 听说你刚开始学习C语言?还不知道学什么?还不知道怎么学?进来坐坐吧,俺们悄悄聊聊!(C语言概述)。
  7. Adobe illustrator 2020 fo Mac苹果中文版安装教程
  8. cloth项目1增加环节
  9. 在matlab中创建mex文件,创建 C 源 MEX 文件
  10. As I Please--PartⅢ