Como Receber um SMS em Kotlin

A maneira mais simples de enviar SMS a partir de Kotlin é usar a API HTTP/Rest de SMS integrada do Ozeki SMS Gateway. Ao usar esta API, você enviará mensagens SMS fazendo uma requisição HTTP Post para o gateway de SMS. A requisição HTTP Post conterá uma mensagem formatada em JSON. O gateway de SMS enviará este SMS para o telefone do destinatário e retornará uma resposta HTTP 200 OK para a sua requisição. (Figura 1)

como receber um sms em kotlin
Figura 1 - Como Receber um SMS em Kotlin

Código Kotlin para receber SMS no celular

O exemplo de código SMS em Kotlin abaixo demonstra como você pode receber mensagens SMS usando a API HTTP Rest de SMS do Ozeki SMS Gateway com a biblioteca Kotlin Ozeki.Libs.Rest. Esta biblioteca é fornecida gratuitamente, e você pode usá-la e modificá-la em qualquer um dos seus projetos.

Vídeo 1 - Como baixar o exemplo ReceiveSms.kt.zip (Tutorial em vídeo)

MainActivity.kt
package receive.sms

import androidx.appcompat.app.AppCompatActivity
import android.os.Bundle
import Ozeki.Libs.Rest.*
import android.widget.ArrayAdapter
import kotlinx.coroutines.*

class MainActivity : AppCompatActivity() {
    @DelicateCoroutinesApi
    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_main)

        val listMessages:android.widget.ListView = findViewById(R.id.listMessages)
        val btnSendRequest:android.widget.Button = findViewById(R.id.btnSendRequest)

        val configuration = Configuration(
            username = "http_user",
            password = "qwe123",
            apiurl = "http://10.0.2.2:9509/api"
        )

        val messages_label : ArrayList<Message> = arrayListOf()

        val arrayAdapter = ArrayAdapter<Message>(this, android.R.layout.simple_list_item_1, messages_label)

        listMessages.adapter = arrayAdapter

        val api = MessageApi(configuration)

        btnSendRequest.setOnClickListener {
            GlobalScope.launch(Dispatchers.IO) {
                val result = api.DownloadIncomming()
                val messages = result.Messages
                for (index in 0 until messages.size) {
                    messages_label.add(messages.get(index))
                }
            }
            arrayAdapter.notifyDataSetChanged()
        }
    }
}
	
main_activity.xml
<?xml version="1.0" encoding="utf-8"?>
<androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    tools:context=".MainActivity">

    <Button
        android:id="@+id/btnSendRequest"
        android:layout_width="320dp"
        android:layout_height="wrap_content"
        android:layout_marginTop="24dp"
        android:backgroundTint="#FF3F3F"
        android:text="Baixar mensagens recebidas"
        app:layout_constraintEnd_toEndOf="parent"
        app:layout_constraintHorizontal_bias="0.505"
        app:layout_constraintStart_toStartOf="parent"
        app:layout_constraintTop_toBottomOf="@+id/listMessages" />

    <TextView
        android:id="@+id/textMessages"
        android:layout_width="320dp"
        android:layout_height="wrap_content"
        android:layout_marginTop="24dp"
        android:text="Mensagens"
        android:textAlignment="center"
        android:textSize="22sp"
        app:layout_constraintEnd_toEndOf="parent"
        app:layout_constraintHorizontal_bias="0.505"
        app:layout_constraintStart_toStartOf="parent"
        app:layout_constraintTop_toTopOf="parent" />

    <ListView
        android:id="@+id/listMessages"
        android:layout_width="320dp"
        android:layout_height="500dp"
        android:layout_marginTop="24dp"
        app:layout_constraintEnd_toEndOf="parent"
        app:layout_constraintStart_toStartOf="parent"
        app:layout_constraintTop_toBottomOf="@+id/textMessages" />
</androidx.constraintlayout.widget.ConstraintLayout>
	

Como usar o exemplo de SMS em Kotlin:

Você pode usar a classe MessageApi para receber mensagens SMS do gateway de SMS. Sua requisição do seu dispositivo será encaminhada para o gateway de SMS através da internet.

Baixar ReceiveSms.kt

O código-fonte explicado neste artigo pode ser baixado, usado e modificado gratuitamente.
Download: ReceiveSms.kt.zip (148Kb)

O que está no arquivo ReceiveSms.kt.zip?

O arquivo ReceiveSms.kt.zip contém um projeto de exemplo, que inclui a biblioteca Ozeki.Libs.Rest. Com esta biblioteca, você pode enviar, excluir, marcar e receber mensagens SMS criando um MessageApi e usando os métodos Send(), Delete(), Mark() e Receive(). (Figura 2)

projeto de exemplo para receber sms usando kotlin
Figura 2 - Diretório ReceiveSms.kt

Como receber SMS com Kotlin (Passos rápidos)

Para receber um SMS com Kotlin:

  1. Instale o Ozeki SMS Gateway
  2. Conecte o Ozeki SMS Gateway à rede móvel
  3. Envie um SMS teste a partir da interface gráfica do Ozeki
  4. Crie um usuário de API HTTP de SMS
  5. Android Studio
  6. Baixe o projeto de exemplo acima
  7. Crie uma API para baixar suas mensagens recebidas
  8. Use o método DownloadIncoming() para receber suas mensagens
  9. Leia a mensagem de resposta no console
  10. Verifique os logs no gateway de SMS

Instale o Ozeki SMS Gateway e crie um usuário de API HTTP

Para poder receber SMS com Kotlin, primeiro você precisa instalar o Ozeki SMS Gateway. O gateway SMS pode ser instalado no mesmo computador onde você desenvolve seu código Kotlin no Android Studio. Após a instalação, o próximo passo é conectar o Ozeki SMS Gateway à rede móvel. Você pode enviar um SMS de teste a partir da interface gráfica do Ozeki para verificar se sua conexão com a rede móvel está funcionando. O passo final para preparar seu ambiente é criar um usuário de API HTTP para SMS. Crie um usuário com o nome de usuário "http_user" e senha "qwe123" para que o exemplo funcione sem modificações.

Após a configuração do ambiente, você pode executar seu código Kotlin.

URL da API HTTP para enviar SMS a partir de Kotlin

Para receber SMS com Kotlin, seu código Kotlin precisará fazer uma requisição HTTP para o gateway SMS. A URL da API é mostrada abaixo. Observe que o endereço IP (127.0.0.1) deve ser substituído pelo endereço IP do seu gateway SMS. Se o Ozeki SMS Gateway estiver instalado no mesmo computador onde o aplicativo JavaScript de SMS está sendo executado, pode ser 127.0.0.1. Se estiver instalado em um computador diferente, deve ser o endereço IP desse computador.

http://127.0.0.1:9509/api?action=rest
	

Autenticação HTTP para receber SMS com Kotlin

Para autenticar o cliente de SMS em Kotlin, você precisa enviar o nome de usuário e senha em uma string codificada em base64 para o servidor em uma requisição HTTP. O formato usado é: base64(nome de usuário+":"+senha). Em Kotlin, você pode usar o seguinte código para fazer essa codificação:

var usernamePassword = "%s:%s".format(username, password)
return "Basic %s".format(Base64.getEncoder().encodeToString(usernamePassword.toByteArray()))
	

Por exemplo, se você codificar o nome de usuário 'http_user' e a senha 'qwe123', você obterá a seguinte string codificada em base64: aHR0cF91c2VyOnF3ZTEyMw==. Para enviar

Cabeçalho da requisição HTTP para enviar SMS a partir de Kotlin

Para receber a(s) mensagem(ns) SMS, você precisa incluir as seguintes linhas como cabeçalhos na requisição HTTP. Observe que incluímos um cabeçalho de tipo de conteúdo e um cabeçalho de Autorização.

Content-Type: application/json
Authorization: Basic QWxhZGRpbjpvcGVuIHNlc2FtZQ==
	

Requisição HTTP para receber SMS com Kotlin

Para receber a(s) mensagem(ns) SMS recebida(s), seu aplicativo Kotlin enviará uma requisição HTTP semelhante à mostrada abaixo. Observe que esta requisição contém uma parte de cabeçalho HTTP e uma parte de corpo HTTP. O corpo HTTP é uma string de dados codificada em JSON. Ela contém o número do destinatário e o texto da mensagem.

GET /api?action=receivemsg&folder=inbox HTTP/1.1
Connection: Keep-Alive
Accept-Encoding: gzip
Authorization: Basic aHR0cF91c2VyOnF3ZTEyMw==
Host: 10.0.2.2:9509
User-Agent: okhttp/4.2.2
	

Resposta HTTP recebida pelo exemplo de SMS em Kotlin

Assim que o gateway SMS receber esta requisição, ele gerará uma resposta HTTP. A resposta HTTP conterá um código de status, para indicar se a requisição de envio de SMS foi bem-sucedida ou não. Ela também retornará uma estrutura codificada em JSON para fornecer detalhes úteis sobre o envio da mensagem.

HTTP/1.1 200 OK
User-Agent: OZEKI 10.3.120 (www.myozeki.com)
Content-Type: application/json; charset=utf8
Last-Modified: Thu, 17 Jun 2021 16:10:48 GMT
Server: 10/10.3.120
Transfer-Encoding: chunked

{
	"http_code": 200,
	"response_code": "SUCCESS",
	"response_msg": "",
	"data": {
	  "folder": "inbox",
	  "limit": "1000",
	  "data": [
	    {
	      "message_id": "ada7ee44-aefc-e746-9376-b76e3674442a",
	      "from_connection": "http_user@localhost",
	      "from_address": "+36203333333",
	      "from_station": "%",
	      "to_connection": "http_user@localhost",
	      "to_address": "http_user",
	      "to_station": "%",
	      "text": "Hello world 3",
	      "create_date": "2021-06-17 16:09:11",
	      "valid_until": "2021-06-24 16:09:11",
	      "time_to_send": "2021-06-17 16:09:11",
	      "submit_report_requested": true,
	      "delivery_report_requested": true,
	      "view_report_requested": true,
	      "tags": [
	        {
	          "name": "Type",
	          "value": "SMS:TEXT"
	        }
	      ]
	    },
	    {
	      "message_id": "fccc6211-c710-c80e-a28f-664ff8b0e964",
	      "from_connection": "http_user@localhost",
	      "from_address": "+36201111111",
	      "from_station": "%",
	      "to_connection": "http_user@localhost",
	      "to_address": "http_user",
	      "to_station": "%",
	      "text": "Hello world 1",
	      "create_date": "2021-06-17 16:09:11",
	      "valid_until": "2021-06-24 16:09:11",
	      "time_to_send": "2021-06-17 16:09:11",
	      "submit_report_requested": true,
	      "delivery_report_requested": true,
	      "view_report_requested": true,
	      "tags": [
	        {
	          "name": "Type",
	          "value": "SMS:TEXT"
	        }
	      ]
	    },
	    {
	      "message_id": "ba782a64-05cd-8ba8-9f4c-e8597ca30b59",
	      "from_connection": "http_user@localhost",
	      "from_address": "+36202222222",
	      "from_station": "%",
	      "to_connection": "http_user@localhost",
	      "to_address": "http_user",
	      "to_station": "%",
	      "text": "Hello world 2",
	      "create_date": "2021-06-17 16:09:11",
	      "valid_until": "2021-06-24 16:09:11",
	      "time_to_send": "2021-06-17 16:09:11",
	      "submit_report_requested": true,
	      "delivery_report_requested": true,
	      "view_report_requested": true,
	      "tags": [
	        {
	          "name": "Type",
	          "value": "SMS:TEXT"
	        }
	      ]
	    }
	  ]
	}
}
	

Como receber mensagens SMS com Kotlin usando a API de SMS e o projeto de exemplo acima (Tutorial em vídeo)

Este vídeo mostra como baixar e usar o projeto ReceiveSms.kt. Uma vez que você abriu o projeto de exemplo, pode notar que há um pacote chamado Ozeki.Libs.Rest. Este é o pacote que contém o MessageApi e tudo o que você precisa para receber mensagens SMS usando Kotlin.

Vídeo 2 - Como receber mensagens SMS com o código Kotlin acima (Tutorial em vídeo)

Como verificar se a solicitação foi aceita pelo usuário HTTP

Após o envio do SMS, é uma boa ideia verificar seu gateway SMS, para ver o que foi recebido. Você pode verificar o log abrindo os detalhes do usuário HTTP no console de gerenciamento do Ozeki SMS Gateway. No final do vídeo acima, você pode ver como verificar se a solicitação foi recebida pelo http_user. (Figura 3)

projeto kotlin para receber mensagens sms
Figura 3 - Projeto ReceiveSms.kt no Android Studio

Como usar o aplicativo em um telefone (tutorial em vídeo)

Na Figura 4, você pode ver como é usar o aplicativo em um telefone. Como você pode ver na imagem Antes, por padrão não há mensagens recebidas. Pressione o botão 'Baixar Entradas' para obter as mensagens enviadas para você. Na foto Depois, você pode ver que todas as informações sobre uma mensagem são visíveis quando você a baixa.

aplicativo de exemplo em kotlin para receber mensagens sms

Figura 4 - Aplicativo de exemplo ReceiveSms antes e depois das mensagens serem baixadas

Como adicionar Ozeki.Libs.Rest ao seu próprio projeto

A biblioteca Ozeki.Libs.Rest pode ser baixada, usada e modificada gratuitamente.
Download: Ozeki.Libs.Rest.kt.zip (7.66Kb)

Se você decidir criar seu aplicativo por conta própria apenas com a biblioteca Ozeki.Libs.Rest, há algumas coisas que você deve alterar em seu aplicativo base. Para usar a biblioteca Ozeki.Libs.Rest, você deve colocá-la na pasta java do diretório principal.
No vídeo a seguir, mostrarei como baixar e adicionar a biblioteca Ozeki.Libs.Rest ao seu próprio projeto.

Vídeo 3 - Como adicionar a biblioteca Ozeki.Libs.Rest ao seu próprio aplicativo (Tutorial em vídeo)

Dependências

É importante mencionar que a biblioteca Ozeki.Libs.Rest tem algumas dependências. Para usá-la, você deve adicionar essas dependências nos Gradle Scripts.

implementation "com.squareup.okhttp3:okhttp:4.2.2"
implementation 'org.jetbrains.kotlinx:kotlinx-coroutines-core:1.5.0'
implementation 'org.jetbrains.kotlinx:kotlinx-coroutines-android:1.5.0'
	

Código 1 - A lista das dependências que você precisa incluir.

Adicionar as dependências (Tutorial em vídeo)

No vídeo a seguir, você verá como anexar as dependências mencionadas anteriormente. Ele começará com a cópia do código e o levará até as dependências adicionadas com sucesso. O vídeo tem apenas 53 segundos, mas contém todas as etapas necessárias para concluir o método. Você pode seguir este tutorial sem esforço.

Vídeo 4 - Como adicionar as dependências necessárias (Tutorial em vídeo)

Acesso à internet

Para que seu aplicativo possa enviar uma solicitação HTTP, você precisa permitir que seu aplicativo se conecte à internet.
No vídeo a seguir, mostrarei como habilitar o acesso à internet para seu aplicativo Kotlin.

<uses-permission android:name="android.permission.INTERNET" />
	

Código 2 - Para habilitar o acesso à internet para seu aplicativo Kotlin.

android:usesCleartextTraffic="true"
	

Código 3 - Para permitir o envio de solicitações HTTP

Como adicionar conexão à internet ao seu projeto (Tutorial em vídeo)

Você precisa adicionar ambas as linhas ao arquivo AndroidManifest.xml.
No próximo vídeo, mostrarei onde você deve inserir os códigos acima. O vídeo começará com a cópia do código e o levará até a conexão à internet adicionada com sucesso. Este vídeo é preciso e fácil de seguir.

Vídeo 5 - Como permitir acesso à internet para seu aplicativo (Tutorial em vídeo)

Conclusão

Este guia foi escrito para mostrar os passos de recebimento de SMS em Kotlin usando o usuário HTTP do Ozeki SMS Gateway. Esta solução ajuda você a coletar as mensagens recebidas na pasta Inbox e movê-las para o seu programa em Kotlin. Usar esta solução dá a você a capacidade de manter seu sistema de mensagens organizado como planejado.

Este é apenas o começo, saiba mais sobre como gerenciar suas mensagens no site da Ozeki. Para se manter eficiente e atualizado, organize as mensagens, leia o próximo artigo sobre Como excluir um SMS em Kotlin.

Vamos trabalhar, configure o Ozeki SMS Gateway agora!

More information