Como agendar 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)
Código Kotlin para enviar um SMS agendado para celular
O exemplo de código de SMS em Kotlin abaixo demonstra como você pode enviar um SMS agendado usando a API 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 de seus projetos.
MainActivity.kt
package send.scheduledsms import androidx.appcompat.app.AppCompatActivity import android.os.Bundle import Ozeki.Libs.Rest.Configuration import Ozeki.Libs.Rest.MessageApi import Ozeki.Libs.Rest.Message import android.text.method.ScrollingMovementMethod import kotlinx.coroutines.Dispatchers import kotlinx.coroutines.GlobalScope import kotlinx.coroutines.launch class MainActivity : AppCompatActivity() { override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) setContentView(R.layout.activity_main) val inputToAddress:android.widget.EditText = findViewById(R.id.inputToAddress) val inputMessage:android.widget.EditText = findViewById(R.id.inputMessage) val date:android.widget.EditText = findViewById(R.id.inputTimeToSendDate) val time:android.widget.EditText = findViewById(R.id.inputTimeToSendTime) val btnSendRequest:android.widget.Button = findViewById(R.id.btnSendRequest) val logBox:android.widget.TextView = findViewById(R.id.logBox) logBox.movementMethod = ScrollingMovementMethod() val configuration = Configuration( username = "http_user", password = "qwe123", apiurl = "http://10.0.2.2:9509/api" ) val api = MessageApi(configuration) btnSendRequest.setOnClickListener { if (inputToAddress.text.toString() != "" && inputMessage.text.toString() != "" && date.text.toString() != "" && time.text.toString() != "") { val datetime = String.format("%s %s", date.text.toString(), time.text.toString()) val msg = Message() msg.ToAddress = inputToAddress.text.toString() msg.Text = inputMessage.text.toString() msg.TimeToSend = datetime GlobalScope.launch(Dispatchers.IO) { val response = api.Send(msg) logBox.text = String.format("%s\n%s", logBox.text, response.toString()) } inputToAddress.text.clear() inputMessage.text.clear() date.text.clear() time.text.clear() } } } }
<?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="50dp" android:layout_marginTop="36dp" android:text="Enviar" android:backgroundTint="#FF3F3F" app:layout_constraintEnd_toEndOf="parent" app:layout_constraintHorizontal_bias="0.494" app:layout_constraintStart_toStartOf="parent" app:layout_constraintTop_toBottomOf="@+id/logBox" /> <TextView android:id="@+id/textToAddress" android:layout_width="320dp" android:layout_height="wrap_content" android:layout_marginTop="36dp" android:text="Para:" android:textSize="20sp" app:layout_constraintEnd_toEndOf="parent" app:layout_constraintHorizontal_bias="0.498" app:layout_constraintStart_toStartOf="parent" app:layout_constraintTop_toTopOf="parent" /> <TextView android:id="@+id/textMessage" android:layout_width="320dp" android:layout_height="wrap_content" android:layout_marginTop="20dp" android:text="Mensagem:" android:textSize="20sp" app:layout_constraintEnd_toEndOf="parent" app:layout_constraintHorizontal_bias="0.505" app:layout_constraintStart_toStartOf="parent" app:layout_constraintTop_toBottomOf="@+id/inputToAddress" /> <TextView android:id="@+id/textWhen" android:layout_width="320dp" android:layout_height="wrap_content" android:layout_marginTop="20dp" android:text="Horário de envio:" android:textSize="20sp" app:layout_constraintEnd_toEndOf="parent" app:layout_constraintHorizontal_bias="0.494" app:layout_constraintStart_toStartOf="parent" app:layout_constraintTop_toBottomOf="@+id/inputMessage" /> <EditText android:id="@+id/inputToAddress" android:layout_width="320dp" android:layout_height="wrap_content" android:layout_marginTop="20dp" android:ems="10" android:hint="+36201111111" android:inputType="textPersonName" app:layout_constraintEnd_toEndOf="parent" app:layout_constraintHorizontal_bias="0.505" app:layout_constraintStart_toStartOf="parent" app:layout_constraintTop_toBottomOf="@+id/textToAddress" /> <EditText android:id="@+id/inputMessage" android:layout_width="320dp" android:layout_height="100dp" android:layout_marginTop="20dp" android:ems="10" android:gravity="start|top" android:hint="Olá mundo!" android:inputType="textMultiLine" app:layout_constraintEnd_toEndOf="parent" app:layout_constraintHorizontal_bias="0.505" app:layout_constraintStart_toStartOf="parent" app:layout_constraintTop_toBottomOf="@+id/textMessage" /> <EditText android:id="@+id/inputTimeToSendTime" android:layout_width="120dp" android:layout_height="wrap_content" android:layout_marginTop="20dp" android:layout_marginEnd="44dp" android:ems="10" android:hint="15:30:00" android:inputType="time" app:layout_constraintEnd_toEndOf="parent" app:layout_constraintTop_toBottomOf="@+id/textWhen" /> <TextView android:id="@+id/logBox" android:layout_width="320dp" android:layout_height="80dp" android:layout_marginTop="20dp" android:scrollbars="vertical" android:text="Logs:" app:layout_constraintEnd_toEndOf="parent" app:layout_constraintHorizontal_bias="0.505" app:layout_constraintStart_toStartOf="parent" app:layout_constraintTop_toBottomOf="@+id/inputTimeToSendTime" /> <EditText android:id="@+id/inputTimeToSendDate" android:layout_width="180dp" android:layout_height="wrap_content" android:layout_marginTop="20dp" android:layout_marginEnd="24dp" android:ems="10" android:hint="2021-06-16" android:inputType="date" app:layout_constraintEnd_toStartOf="@+id/inputTimeToSendTime" app:layout_constraintHorizontal_bias="1.0" app:layout_constraintStart_toStartOf="parent" app:layout_constraintTop_toBottomOf="@+id/textWhen" /> </androidx.constraintlayout.widget.ConstraintLayout>
Como usar o exemplo de SMS em Kotlin:
Você pode usar a classe Message para criar o SMS e a classe MessageApi para enviar o SMS agendado para o gateway de SMS. O gateway de SMS encaminhará sua mensagem para a rede móvel através de uma conexão sem fio ou pela Internet.
Baixar SendScheduledSms.kt
O código-fonte explicado neste artigo pode ser baixado, usado e modificado gratuitamente.
Download: SendScheduledSms.kt.zip (149Kb)
O que está no arquivo SendScheduledSms.kt.zip?
O arquivo SendScheduledSms.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)
Como enviar um SMS agendado a partir de Kotlin (Passos rápidos)
Para enviar um SMS agendado a partir de Kotlin:
- Instale o Ozeki SMS Gateway
- Conecte o Ozeki SMS Gateway à rede móvel
- Envie um SMS de teste a partir da interface gráfica do Ozeki
- Crie um usuário de API HTTP para SMS
- Android Studio
- Baixe o projeto de exemplo acima
- Crie o SMS criando um novo objeto Message
- Crie uma API para enviar sua mensagem agendada
- Use o método Send para enviar sua mensagem agendada
- Leia a mensagem de resposta no console
- Verifique os logs no SMS gateway
Instale o Ozeki SMS Gateway e crie um usuário de API HTTP
Para poder enviar SMS a partir de Kotlin, primeiro você precisa 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 enviar um SMS agendado a partir de Kotlin, seu código Kotlin precisará fazer uma requisição HTTP para o SMS gateway. 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 SMS gateway. Se o Ozeki SMS Gateway estiver instalado no mesmo computador onde o aplicativo de SMS em JavaScript 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 enviar um SMS agendado a partir de 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', obterá a seguinte string codificada em base64: aHR0cF91c2VyOnF3ZTEyMw==. Para enviar
Cabeçalho da requisição HTTP para enviar SMS a partir de Kotlin
Para enviar as mensagens 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 enviar SMS a partir de Kotlin
Para enviar o SMS, 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. Ele contém o número do destinatário e o texto da mensagem.
POST /api?action=sendmsg HTTP/1.1 Connection: Keep-Alive Content-Length: 320 Content-Type: application/json; charset=utf-8 Accept-Encoding: gzip Authorization: Basic aHR0cF91c2VyOnF3ZTEyMw== Host: 10.0.2.2:9509 User-Agent: okhttp/4.2.2 { "messages": [ { "message_id": "e68f8e11-dce2-48e2-a2c5-1d2efa98272a", "to_address": "+36201111111", "text": "Olá mundo!", "create_date": "2021-06-17T15:04:03", "valid_until": "2021-06-24T15:04:03", "time_to_send": "2021-06-17 15:10:00", "submit_report_requested": true, "delivery_report_requested": true, "view_report_requested": true } ] }
Resposta HTTP recebida pelo exemplo de SMS em Kotlin
Assim que o gateway de SMS receber esta solicitação, ele gerará uma resposta HTTP. A resposta HTTP conterá um código de status para indicar se o envio do SMS foi bem-sucedido ou não. 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 14:56:26 GMT Server: 10/10.3.120 Transfer-Encoding: chunked { "http_code": 200, "response_code": "SUCCESS", "response_msg": "Mensagens enfileiradas para entrega.", "data": { "total_count": 1, "success_count": 1, "failed_count": 0, "messages": [ { "message_id": "e68f8e11-dce2-48e2-a2c5-1d2efa98272a", "from_station": "%", "to_address": "+36201111111", "to_station": "%", "text": "Olá mundo!", "create_date": "2021-06-17 15:04:03", "valid_until": "2021-06-24 15:04:03", "time_to_send": "2021-06-17 15:10:00", "submit_report_requested": true, "delivery_report_requested": true, "view_report_requested": false, "tags": [ { "name": "Type", "value": "SMS:TEXT" } ], "status": "SUCCESS" } ] } }
Como enviar um SMS agendado em 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 SendScheduledSms.kt. Ao abrir o projeto de exemplo, você pode notar que há um pacote chamado Ozeki.Libs.Rest. Este é o pacote que contém a MessageApi e tudo o que você precisa para enviar um SMS agendado usando Kotlin.
Como verificar se o SMS foi aceito pelo usuário HTTP
Após o envio do SMS, é uma boa ideia verificar no seu gateway de SMS 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.
Como o aplicativo aparece em um telefone (Tutorial em vídeo)
Na Figura 4, você pode ver a interface do usuário do aplicativo em um telefone. Como você pode ver nas imagens antes e depois, o envio de SMS agendado é muito fácil com este aplicativo. Após o envio da mensagem, o log do processo de envio será visível abaixo da caixa de texto 'Hora de enviar'. Você pode obter todas as informações sobre a mensagem enviada aqui.
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.
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'
Adicionando dependências ao projeto (Tutorial em vídeo)
No vídeo a seguir, você aprenderá como adicionar as dependências mencionadas anteriormente. Ele começará com a cópia do código e o guiará até as dependências serem anexadas com sucesso. O vídeo tem apenas 53 segundos, mas contém todas as ações necessárias para concluir o processo. Você pode seguir este tutorial sem qualquer esforço.
Acesso à internet
Para que sua aplicação possa enviar
uma requisição HTTP, você precisa permitir que sua aplicação
se conecte à internet.
No vídeo a seguir, mostrarei como habilitar o acesso à internet
para sua aplicação em Kotlin.
<uses-permission android:name="android.permission.INTERNET" />
android:usesCleartextTraffic="true"
Você precisa adicionar ambas as linhas ao arquivo AndroidManifest.xml. No vídeo a seguir, mostrarei onde você deve colocar os códigos acima. Você precisa adicionar ambas as linhas ao arquivo AndroidManifest.xml. No vídeo a seguir, mostrarei onde você deve colocar os códigos acima. O vídeo começará com a cópia e colagem do código e o levará até a conexão à internet ser adicionada com sucesso. Este vídeo é detalhado e oferece uma experiência fácil de acompanhar.
Resumo
Este guia mostra os passos para agendar SMS em Kotlin usando o Ozeki SMS Gateway via HTTP. Agendar SMS para entregar as mensagens quando seus clientes têm tempo para lê-las realmente ajuda a manter um bom relacionamento com eles. Cuidar dos pequenos detalhes, como encontrar o momento perfeito para compartilhar pensamentos e informações, é essencial se você quiser mostrar o quão profissional é o seu negócio.
Continue lendo tutoriais como este no site da Ozeki. Há mais informações sobre como usar Kotlin para operar com mensagens SMS. A seguir, aprenda Como receber um SMS em Kotlin.
Baixe o Ozeki SMS Gateway agora e use o que você aprendeu!
More information
- Kotlin enviar SMS com a API REST HTTP (exemplo de código)
- Kotlin enviar múltiplos SMS com a API REST HTTP (exemplo de código)
- Kotlin agendar SMS com a API REST HTTP (exemplo de código)
- Kotlin receber SMS com a API REST HTTP (exemplo de código)
- Kotlin excluir SMS com a API REST HTTP (exemplo de código)
- Github: API de SMS em Kotlin