android - Kotlin:如何获取短信发件人的电话号码
问题描述
我正在尝试阅读用户的 SMS 消息并获取这些消息的发件人的电话号码。当我尝试通过该"address"
列获取消息的发件人电话号码时,它会返回文本对话的电话号码(例如,如果我向电话号码为X的用户发送消息,则该address
列返回X而不是我的电话号码),而不是发送消息的人的电话号码。下面是我的 Kotlin 代码:
var cursor = contentResolver.query(
Uri.parse("content://sms/"),
null,
null,
null,
null
)
// Retrieve the IDs of the sender's name
var senderID = cursor!!.getColumnIndex("address")
// Iterate through every message
while (cursor!!.moveToNext()) {
var messageSender = cursor.getString(senderID) // Get the sender of the message
System.out.println("---------------------------------------------------------")
System.out.println(messageSender) // Returns phone number of the conversation, not the sender
}
例如:电话号码为 123456789 的用户向您发送消息。我想检索电话号码 123456789。
解决方案
我找到了解决方案。您必须使用该type
列来确定消息是已发送还是已接收。
消息发送后,您可以从电话管理器中读取电话号码。
fun getMessageSender(cursor: Cursor): String {
val partnerAddressId = cursor.getColumnIndex("address")
val typeId = cursor.getColumnIndex("type")
val partnerAddress = cursor.getString(partnerAddressId)
val type = cursor.getString(typeId)
return if (type.equals("1", true)) {
partnerAddress
} else {
getPhoneNumber()
}
}
private fun getPhoneNumber(): String {
val telephonyManager = getSystemService(Context.TELEPHONY_SERVICE) as TelephonyManager
return telephonyManager.line1Number
}
但请注意,我不知道这会如何影响具有 Multi Sim 的设备。我可以想象这里会返回错误的数字。
我已经结合以下帖子制定了这个解决方案:
通过 content://sms/ 获取每个短信
的电话号码 以编程方式获取 Android 手机的电话号码
推荐阅读
- vba - 运行由 MS Project 中的下拉菜单触发的宏
- javascript - jquery 或 js 以防止 ios 上的正文滚动
- c# - 使用算法 Salsa20 加密文件
- google-cloud-dataflow - 防止 Apache Beam / Dataflow 流 (python) 管道中的融合以消除管道瓶颈
- android - TimePicker 分钟间隔
- c++ - 似乎无法使用对代理类中的 for 循环的调用从主打印字符串数组(agents.cpp)
- wcf - 由 IIS 或本地 Windows 服务托管的服务
- c# - 在 RichTextBox 中插入指向文本的链接
- angular - 更改图标如果文本中有任何条目
- oracle - Oracle 多值组