我如何阅读 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}")
}
}
关于短信我会知道一件事...
我知道可以阅读 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}")
}
}