Android监听短信,并读取短信内容

前段时间有个定制化的项目其中有个功能是监听手机短信并将接收到的短信内容上报给后台。
当我首次看到这个功能之后第一反应是通过BroadcastReceiver 注册一个短信的广播来实现。后来翻阅一些资料后发现使用ContentResolver实现起来更方便。
通过ContentProvider来实现短信的读取操作。
通过ContentResolver的registerContentObserver 注册ContentObserver观察者来实现短信监听效果。

package com.lijianjian.getsmsapp

import android.app.Service
import android.content.ContentResolver
import android.content.Intent
import android.database.ContentObserver
import android.net.Uri
import android.os.Handler
import android.os.HandlerThread
import android.os.IBinder
import android.util.Log

class ListenerSMSService : Service() {
    //用于在子线程中执行异步操作(这是指短信的查询操作)
    private var handlerThread: HandlerThread? = null
    private var threadHandler: Handler? = null

    override fun onBind(intent: Intent?): IBinder? {
        contentResolver.registerContentObserver(Uri.parse("content://sms/"), true, contentObserver)
        handlerThread = object : HandlerThread("sms") {
            override fun onLooperPrepared() {
                super.onLooperPrepared()
                threadHandler = Handler(handlerThread?.looper)
            }
        }
        handlerThread?.start()
        return MyBinder(this)
    }

    override fun onUnbind(intent: Intent?): Boolean {
        contentResolver.unregisterContentObserver(contentObserver)
        return super.onUnbind(intent)
    }

    private val contentObserver = object : ContentObserver(Handler()) {
    
        override fun onChange(selfChange: Boolean, uri: Uri?) {
            super.onChange(selfChange, uri)
            Log.e("contentObserver", "onChange(selfChange: Boolean, uri: Uri?)")
            uri?.let {
                val value = it.toString()
                Log.e("contentObserver", "uri==$value")
                if (value == "content://sms/inbox-insert") {
                    getSMSBody(Uri.parse("content://sms/inbox/"))
                }
            }
        }
    }

    private fun getSMSBody(uri: Uri) {
        threadHandler?.let {
            runnable.uri = uri
            runnable.contentResolver = contentResolver
            it.postDelayed(runnable, 3000)
        }
    }

    private val runnable = object : Runnable {
        var uri: Uri? = null
        var contentResolver: ContentResolver? = null
        override fun run() {
            contentResolver?.let {
                if (uri != null) {
                    val stringBuilder = StringBuilder()
                    val selection = arrayOf("_id", "body", "read")
                    val cursor = it.query(
                        uri!!,
                        selection,
                        " date >${System.currentTimeMillis() - 10 * 60 * 1000}",
                        null,
                        "date desc"
                    )
                    cursor?.let { cursor ->
                        val idIndex = cursor.getColumnIndex("_id")
                        val bodyIndex = cursor.getColumnIndex("body")
                        val readIndex = cursor.getColumnIndex("read")
                        if (cursor.count > 0) {
                            cursor?.moveToFirst()
                            do {
                                val id = cursor.getInt(idIndex)
                                val body = cursor.getString(bodyIndex)
                                val read = cursor.getString(readIndex)
                                stringBuilder.append("id=$id").append("body=$body")
                                    .append("read=$read").append("\n")
                            } while (cursor.moveToNext())
                        }
                    }
                    Log.e("stringBuilder", "stringBuilder==${stringBuilder.toString()}")
                }
            }
        }
    }
}
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • Android是一种基于Linux的自由及开放源代码的操作系统,主要使用于移动设备,如智能手机和平板电脑,由Goo...
    Androidgiao阅读 1,051评论 0 3
  • Android四大组件: activity: activity的生命周期:activity是context的子类,...
    梧桐树biu阅读 661评论 0 2
  • 我是黑夜里大雨纷飞的人啊 1 “又到一年六月,有人笑有人哭,有人欢乐有人忧愁,有人惊喜有人失落,有的觉得收获满满有...
    陌忘宇阅读 8,607评论 28 53
  • 信任包括信任自己和信任他人 很多时候,很多事情,失败、遗憾、错过,源于不自信,不信任他人 觉得自己做不成,别人做不...
    吴氵晃阅读 6,232评论 4 8
  • 步骤:发微博01-导航栏内容 -> 发微博02-自定义TextView -> 发微博03-完善TextView和...
    dibadalu阅读 3,189评论 1 3