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

后端 未结 11 2529
情深已故
情深已故 2020-11-22 02:48

I want to retrieve the SMS messages from the device and display them?

11条回答
  •  庸人自扰
    2020-11-22 03:12

    The easiest function

    To read the sms I wrote a function that returns a Conversation object:

    class Conversation(val number: String, val message: List)
    class Message(val number: String, val body: String, val date: Date)
    
    fun getSmsConversation(context: Context, number: String? = null, completion: (conversations: List?) -> Unit) {
            val cursor = context.contentResolver.query(Telephony.Sms.CONTENT_URI, null, null, null, null)
    
            val numbers = ArrayList()
            val messages = ArrayList()
            var results = ArrayList()
    
            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
            }
    
            completion(results)
        }
    

    Using:

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

    Or get only conversation of specific number:

    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}")
        }
    }
    

提交回复
热议问题