Android监听手机短信

这篇具有很好参考价值的文章主要介绍了Android监听手机短信。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

Android监听手机短信的方法有两种,分别为:

1、接受系统的短信广播:当手机收到新消息时,会发送一条广播,通过该广播就可以获取短信内容;

2、监听短信数据库:利用观察者模式监听短信数据库,当短信数据库改变时就可以触发观察者模式的onChange()方法,但是onChang回调或获取短信不是最新,以及获取重复短信问题。


sms主要结构:

  _id: 短信序号,如100

  thread_id:对话的序号,如100,与同一个手机号互发的短信,其序号是相同的

  address: 发件人地址,即手机号,如+86138138000

  person: 发件人,如果发件人在通讯录中则为具体姓名,陌生人为null

  date: 日期,long型,如1346988516,可以对日期显示格式进行设置

  protocol: 协议0SMS_RPOTO短信,1MMS_PROTO彩信

  read: 是否阅读0未读,1已读

  status: 短信状态-1接收,0complete,64pending,128failed

  type: 短信类型1是接收到的,2是已发出

  body: 短信具体内容

  service_center:短信服务中心号码编号,如+8613800755500


第一种方式接收系统的短信广播: A、这种方式只对新收到的短消息有效,运行代码,并不会读取收件箱中已读或未读的消息,只有当收到新来的短消息时,才会执行onReceive()方法。

B、并且这个广播是有序广播,如果当别的程序先读取到了这个广播,然后拦截掉了个这个广播,你将接收不到。当然我们可以通过设置priority的数值,其实有时是不管用的,现在在一些定制的系统或是有安全软件的情况下,往往短消息都被截取到,并被干掉。

<uses-permission android:name="android.permission.RECEIVE_SMS" /> <!-- 接收短信权限 -->
<uses-permission android:name="android.permission.READ_SMS" /> <!-- 读取短信权限 -->

<receiver android:name="com.example.smslistenerdemo.SmsReceiver" >
            <intent-filter android:priority="2147483647" >
                <action android:name="android.provider.Telephony.SMS_RECEIVED" />
            </intent-filter>
 </receiver>
public class SmsReceiver extends BroadcastReceiver {
//    private static MessageListener mMessageListener;

    private Context mContext;
    public static final String SMS_RECEIVED_ACTION = "android.provider.Telephony.SMS_RECEIVED";
    public static final String SMS_DELIVER_ACTION = "android.provider.Telephony.SMS_DELIVER";

    @Override
    public void onReceive(Context context, Intent intent) {
        this.mContext = context;
     
        Toast.makeText(context, "接收短信执行了.....", Toast.LENGTH_LONG).show();
        Log.e("日志:广播::onReceive", isOrderedBroadcast() + "");
        Log.e("日志:onReceive...", "-接收短信执行了......"+intent.getStringExtra("sele"));
        String action = intent.getAction();
        if (SMS_RECEIVED_ACTION.equals(action) || SMS_DELIVER_ACTION.equals(action) ) {
           
            Log.e("日志:onReceive。。。", "开始接收短信.....");
            Bundle bundle = intent.getExtras();
            if (bundle != null) {
                Object[] pdus = (Object[]) bundle.get("pdus");
                if (pdus != null && pdus.length > 0) {
                    SmsMessage[] messages = new SmsMessage[pdus.length];
                    for (int i = 0; i < pdus.length; i++) {
                        byte[] pdu = (byte[]) pdus[i];
                        messages[i] = SmsMessage.createFromPdu(pdu);
                    }
                    for (SmsMessage message : messages) {
                        String content = message.getMessageBody();// 得到短信内容
                        String sender = message.getOriginatingAddress();// 得到发信息的号码
                        Date date = new Date(message.getTimestampMillis());
                        SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
                        format.setTimeZone(TimeZone.getTimeZone("GMT+08:00"));
                        String dateContent = format.format(date);

                    if ((sender.equals("8610086") || sender.equals(Constant.phone))){
                        Log.e("日志:短信时间::: ", format.format(date) + " ");
                        Log.e("日志:发信息的号码 ", sender + " ");
                        Log.e("日志:得到短信内容 ", content + " ");
                        this.abortBroadcast();// 中止
                    }

                    }
                }

            }
        }
    }
}

开启Service实现锁屏监听

在Activity中监听短信,当应用被放入后台或者屏幕锁定一段时间后就无法继续将短信内容上传服务器,所以需要启动一个Service,在Service中监听短信,就可以在锁屏后继续监听短信

要启动Service,首先需要在申请android.permission.FOREGROUND_SERVICE权限,该权限为普通权限,所以只要在AndroidManifest.xml中声明即可

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

之后还需要在AndroidManifest.xml中添加Service类对应的<service>标签,其中三条属性值的含义分别为:

android:name为pakagename+Service类名,pakagename可以省略;

android:enabled表示是否可以被系统实例化;

android:exported表示其它应用的组件是否可以唤醒service或者和这个service进行交互;文章来源地址https://www.toymoban.com/news/detail-509547.html

<service
  android:name=".MyService"
  android:enabled="true"
  android:exported="true"\>
public class SmsObserver extends ContentObserver {

    public Context mContext;
    public SmsHandler smsHandler;
    private static int id=0; //这里必须用静态的,防止程序多次意外初始化情况
    String _id;
    public SmsObserver(Context context, SmsHandler handler) {
        super(handler);
        this.mContext = context;
        this.smsHandler = handler;
    }
    @Override
    public void onChange(boolean selfChange) {
        super.onChange(selfChange);

        Log.i("日志:SmsObserver", "SmsObserver ------短信有改变------");
//        Cursor mCursor = mResolver.query(Uri.parse("content://sms/inbox"),
//                null, null, null, "date desc");
        Cursor mCursor = mContext.getContentResolver().query(Uri.parse("content://sms/inbox"), null, null, null, "date desc");

        if (mCursor == null) {
            return;
        } else {
            if (mCursor.moveToFirst()){
                SmsInfo _smsInfo = new SmsInfo();
                int _inIndex = mCursor.getColumnIndex("_id");
                if (_inIndex != -1) {
                     _id = mCursor.getString(_inIndex);
                    _smsInfo._id=_id;
                }
                Log.e("日志:SmsObserver ...", "id:::"+id);
                //比较id 解决重复问题
                if (id < Integer.parseInt(_id)) {
                    id = Integer.parseInt(_id);

                    int thread_idIndex = mCursor.getColumnIndex("thread_id");

                    _smsInfo.thread_id = mCursor.getString(thread_idIndex);

                    int bodyIndex = mCursor.getColumnIndex("body");
                    _smsInfo.smsBody = mCursor.getString(bodyIndex);
                    int dateIndex = mCursor.getColumnIndex("date");
                    String date = mCursor.getString(dateIndex);
                    SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd hh:mm:ss");
                    _smsInfo.date = dateFormat.format(new Date(Long.parseLong(date)));
                    int addressIndex = mCursor.getColumnIndex("address");
                    String address=   mCursor.getString(addressIndex);

                    if (address.contains("10086")) {
                        id = Integer.parseInt(_id);
                        Log.e("日志:SmsObserver ...", "10086::"+address);
                        Message msg = smsHandler.obtainMessage();
                        _smsInfo.action = 0;// 0不对短信进行操作;1将短信设置为已读;2将短信删除
                        msg.obj = _smsInfo;
                        smsHandler.sendMessage(msg);

                        //发广播
                        Intent intent = new Intent("com.zl.zl_sms_monitor_DBiErICZ");
                        intent.putExtra("hello", address);         //向广播接收器传递数据
                        mContext.sendBroadcast(intent);
                        return;
                      }
                    Log.e("日志:SmsObserver ...", "获取的短信内容::"+_smsInfo.toString());

                }
            }
           // getHttp();

        }

        if (mCursor != null) {
            mCursor.close();
            mCursor = null;
        }
    }
}
public class SmsService  extends Service {

    private  SmsObserver mObserver = new SmsObserver(this, new SmsHandler(this));
    @Nullable
    @Override
    public IBinder onBind(Intent intent) {
        return null;
    }

    @Override
    public void onCreate() {
        Toast.makeText(this,"SmsService服务器启动了。。。",  Toast.LENGTH_LONG).show();
        //所有短信  注册
        getContentResolver().registerContentObserver(Uri.parse("content://sms"),true, mObserver);
    }

    @Override
    public void onDestroy() {
        super.onDestroy();
        this.getContentResolver().unregisterContentObserver(mObserver);
        Process.killProcess(Process.myPid());
    }

}

到了这里,关于Android监听手机短信的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • iPhone手机如何将短信同步到安卓手机上

    1.下载爱思助手 2.备份全量数据 3.用爱思助手查看备份数据;注:一定要用专业模式查看  4.代开专业模式,就能查看短信模块得数据,并且到导出成 sms.db文件 5. 用在线 db文件转成csv文件格式;地址:DB轉CSV 線上 - db轉成csv 6.用360手机助手加载csv文件

    2024年02月07日
    浏览(98)
  • (短信服务)java SpringBoot 阿里云短信功能实现发送手机验证码

    阿里云官网: https://www.aliyun.com/ 点击官网首页注册按钮。 注册成功后,点击登录按钮进行登录。登录后进入短信服务管理页面,选择国内消息菜单: 短信签名是短信发送者的署名,表示发送方的身份。 切换到【模板管理】标签页: 短信模板包含短信发送内容、场景、变量信息

    2024年02月02日
    浏览(56)
  • 前端实现手机短信验证码倒计时效果

    实现效果:实现按钮倒计时10s后可重新发送验证码 一、思路 1、禁用按钮,调用后端接口,获取验证码 2、setTimeOut(() = {},1000)延迟1s执行,time - 1,返回文案,9s 3、迭代处理,调用自身函数,time - 1,返回文案,8s,实现9s 8s 7s 这样倒计时的效果。 4、不能无限迭代减1,判断时

    2024年02月04日
    浏览(59)
  • 使用自动化测试获取手机短信验证码

    目前在职测试开发,,写一些脚本,个人认为这职业不科学不应该有的职业,测试就是测试,开发就是开发,运维还是老鸟,这行业总能折腾些莫名其妙的东西出来,刚做这行时学的第一门语言是bash shell, 去新去单位上班直接写了个一键搭建测试环境的测试脚本,本来不想干测试了,好好做

    2024年01月21日
    浏览(50)
  • SpringBoot——短信发送、手机验证码登录

    目录 一、短信发送 1.1 阿里云短信服务 1.1.1 设置短信签名 1.1.2 模板管理 1.1.3 设置AccessKey 1.2 短信发送——代码开发 1.2.1 导入maven坐标 1.2.2 调用API 1.2  手机验证码登录 1.2.1 用户数据库表 1.2.2  修改过滤器 1.2.3   随机生成验证码的工具类 1.2.4 手机验证码登录-- 发送验证码

    2023年04月22日
    浏览(44)
  • uniapp获得手机通话记录、短信等权限

    获取通话记录 permission.js中部分代码(参考插件App权限判断和提示 - DCloud 插件市场)

    2024年04月12日
    浏览(40)
  • html调用手机打电话、发短信功能

    在html头部里面加上: meta name=\\\"format-detection\\\" content=\\\"telephone=yes\\\"/ 在需要拨打电话的地方: lable13366668888/label ahref=\\\"tel:13366668888\\\" 打电话 当点击页面上电话号码的时候 ,这个时候页面会跳转到手机打电话的界面,并把号码附在上面,点击即可拨通。 如需要发短信: lable1336666888

    2024年02月11日
    浏览(44)
  • 【利用宝塔WebHook插件、SmsForwarder(短信转发器)、quicker实现电脑端自动输入手机短信验证码登录】

    最近公司各种系统有一些小改动,闲置几分钟就得重新登录,然后每次登录得:打开手机→查看验证码短信→在电脑上手动输入,实在是太影响 效率 (心情)。为了更好地 搬砖 (摸鱼),利用一些小工具实现了手机验证码转发并自动输入。 服务器设定weebhook——手机验证码

    2024年03月27日
    浏览(66)
  • 【iPhone】手机上接收短信同步转发到iPad和Mac,为什么没有短信转发解决办法

      当iPad和Mac上登录的都是同一个AppleID时,可以开启短信转发,这样三个设备可以同时收到短信,非常方便。 设置-信息-发送与接收-最下面的 蓝字Apple ID 需要一致   只需要在iPhone的设置- FaceTime通话 - 蓝字Apple ID 重新登入登出一下,就可以在信息里看到短信转发了

    2024年02月07日
    浏览(206)
  • chatgpt赋能python:Python如何获取手机短信验证码

    在现代社会里,验证码已经成为了各种网站、APP、银行等机构对用户身份认证的必备手段。从有用性角度考虑,我们需要确保验证码的真实有效性,从而保护用户信息的安全。而为了方便用户接收验证码,手机短信成为一种比较受欢迎的验证码发送工具。 但是,一旦手机接收

    2024年02月11日
    浏览(52)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包