我如何阅读 Android 中的短信?

How i can read sms in Android?

关于短信我会知道一件事...

我知道可以阅读 Android 中的短信,但我不知道如何阅读 "Unread SMS",尤其是如何加入 "sender" 等每个字段, "SMS", "date", "time", "text".

我必须做的是:当收到短信时,应用程序"reads" 消息并将所有信息存储在数据结构中。

重要: 另一个问题:是否可以在 WhatsApp 或其他 IM 应用程序(例如 facebook messenger)中读取 "Unread SMS"? 在这种情况下,我如何加入每个字段?

此致

阅读Phone短信

看看这个How can I read SMS messages from the device programmatically in Android?

正在阅读 Facebook 消息

对于 facebook,您需要实施他们的 API。看到这个 Read Messages in Facebook

正在阅读 Whatsapp 消息

选项 1

Whatsapp 没有发布任何官方 APIs.

有这个开源 API 用于与 whatsapp 通信,它不是官方的,如果 Whatsapp 更新他们的协议可能会停止工作。

https://github.com/venomous0x/WhatsAPI

关于使用此或其他非官方API的合法性,取决于您与Whatsapp同意的服务协议。阅读它,看看他们是否不赞成与其他客户使用他们的通信协议。我的猜测是他们不允许这样做。

选项 2

WhatsApp 每天凌晨 4 点在您的 SD 卡上进行聊天备份。这是一个使用 AES 密钥加密的单一数据库。由于它在外部存储上,如果您有权访问外部存储,您的应用程序可以读取它。

你可以很容易地解密这个数据库(网上有一篇论文)。

但是,这只会每 24 小时为您提供一次更新的聊天记录。

如果您想要更多的实时更新,您的设备必须被 root,并且您将需要一个全新的解析器,因为在内部存储上,聊天记录存储在多个数据库中。

选项 3

阅读这个 SO 问题 Get all messages from Whatsapp

注意:我不确定 Whatsapp 的内容。它只是各种帖子的汇编。

最简单的函数

为了阅读短信,我写了一个 returns 一个对话对象的函数:

class Conversation(val number: String, val message: List<Message>)
class Message(val number: String, val body: String, val date: Date)

fun getSmsConversation(context: Context, number: String? = null, completion: (conversations: List<Conversation>?) -> Unit) {
        val cursor = context.contentResolver.query(Telephony.Sms.CONTENT_URI, null, null, null, null)

        val numbers = ArrayList<String>()
        val messages = ArrayList<Message>()
        var results = ArrayList<Conversation>()

        while (cursor != null && cursor.moveToNext()) {
            val smsDate = cursor.getString(cursor.getColumnIndexOrThrow(Telephony.Sms.DATE))
            val number = cursor.getString(cursor.getColumnIndexOrThrow(Telephony.Sms.ADDRESS))
            val body = cursor.getString(cursor.getColumnIndexOrThrow(Telephony.Sms.BODY))

            numbers.add(number)
            messages.add(Message(number, body, Date(smsDate.toLong())))
        }

        cursor?.close()

        numbers.forEach { number ->
            if (results.find { it.number == number } == null) {
                val msg = messages.filter { it.number == number }
                results.add(Conversation(number = number, message = msg))
            }
        }

        if (number != null) {
            results = results.filter { it.number == number } as ArrayList<Conversation>
        }

        completion(results)
    }

使用:

getSmsConversation(this){ conversations ->
    conversations.forEach { conversation ->
        println("Number: ${conversation.number}")
        println("Message One: ${conversation.message[0].body}")
        println("Message Two: ${conversation.message[1].body}")
    }
}

或者只获取特定号码的对话:

getSmsConversation(this, "+33666494128"){ conversations ->
    conversations.forEach { conversation ->
        println("Number: ${conversation.number}")
        println("Message One: ${conversation.message[0].body}")
        println("Message Two: ${conversation.message[1].body}")
    }
}