首页 > 解决方案 > 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

标签: androidkotlinsms

解决方案


我找到了解决方案。您必须使用该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 手机的电话号码


推荐阅读