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!