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)

como agendar um sms em kotlin
Figura 1 - Como agendar um SMS em Kotlin

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.

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

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

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

projeto de exemplo para enviar sms agendado usando kotlin
Figura 2 - Diretório SendScheduledSms.kt

Como enviar um SMS agendado a partir de Kotlin (Passos rápidos)

Para enviar um SMS agendado a partir de Kotlin:

  1. Instale o Ozeki SMS Gateway
  2. Conecte o Ozeki SMS Gateway à rede móvel
  3. Envie um SMS de teste a partir da interface gráfica do Ozeki
  4. Crie um usuário de API HTTP para SMS
  5. Android Studio
  6. Baixe o projeto de exemplo acima
  7. Crie o SMS criando um novo objeto Message
  8. Crie uma API para enviar sua mensagem agendada
  9. Use o método Send para enviar sua mensagem agendada
  10. Leia a mensagem de resposta no console
  11. 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.

Vídeo 2 - Como enviar um SMS agendado com o código em Kotlin acima (Tutorial em vídeo)

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.

projeto em kotlin para enviar mensagens sms agendadas
Figura 3 - Projeto SendScheduledSms.kt no Android Studio

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.

exemplo de aplicativo em kotlin para enviar sms agendado

Figura 4 - Aplicativo de exemplo SendScheduledSms antes e depois do envio das mensagens

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.

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.

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

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" />
	

Código 2 - Para habilitar o acesso à internet para sua aplicação em Kotlin.

android:usesCleartextTraffic="true"
	

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

Habilitando conexão à internet para seu projeto (Tutorial em vídeo)

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.

Vídeo 5 - Como permitir acesso à internet para sua aplicação (Tutorial em vídeo)

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