Como Excluir 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 essa 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á esse SMS para o telefone do destinatário e retornará uma resposta HTTP 200 OK para sua requisição. (Figura 1)

como excluir um sms em kotlin
Figura 1 - Como Excluir um SMS em Kotlin

Código Kotlin para excluir sms

O exemplo de código SMS em Kotlin abaixo demonstra como você pode excluir 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 de seus projetos.

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

MainActivity.kt
package delete.sms

import Ozeki.Libs.Rest.Configuration
import Ozeki.Libs.Rest.Folder
import Ozeki.Libs.Rest.MessageApi
import Ozeki.Libs.Rest.Message
import androidx.appcompat.app.AppCompatActivity
import android.os.Bundle
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 folderCategories:android.widget.Spinner = findViewById(R.id.folderCategories)
        val ID:android.widget.EditText = findViewById(R.id.inputId)
        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 (ID.text.toString() != "") {

                val msg = Message()
                msg.ID = ID.text.toString()

                val folder: Folder

                when (folderCategories.selectedItem.toString()) {
                    "Outbox" -> folder = Folder.Outbox;
                    "Sent" -> folder = Folder.Sent;
                    "Not sent" -> folder = Folder.NotSent;
                    "Deleted" -> folder = Folder.Deleted;
                    else -> folder = Folder.Inbox
                }
                GlobalScope.launch(Dispatchers.IO) {
                    val response = api.Delete(folder, msg)
                    logBox.text = String.format("%s\n%s", logBox.text, response.toString())
                }
                ID.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">

    <TextView
        android:id="@+id/textId"
        android:layout_width="320dp"
        android:layout_height="wrap_content"
        android:layout_marginTop="36dp"
        android:text="ID:"
        android:textSize="20dp"
        app:layout_constraintEnd_toEndOf="parent"
        app:layout_constraintHorizontal_bias="0.494"
        app:layout_constraintStart_toStartOf="parent"
        app:layout_constraintTop_toTopOf="parent" />

    <EditText
        android:id="@+id/inputId"
        android:layout_width="320dp"
        android:layout_height="wrap_content"
        android:layout_marginTop="40dp"
        android:ems="10"
        android:hint="4c24263b-dacc-48d1-b179-b7e64f08eb26"
        android:inputType="textPersonName"
        app:layout_constraintEnd_toEndOf="parent"
        app:layout_constraintHorizontal_bias="0.494"
        app:layout_constraintStart_toStartOf="parent"
        app:layout_constraintTop_toBottomOf="@+id/textId" />

    <Spinner
        android:id="@+id/folderCategories"
        android:layout_width="320dp"
        android:layout_height="50dp"
        android:layout_marginTop="40dp"
        android:entries="@array/folders"
        app:layout_constraintEnd_toEndOf="parent"
        app:layout_constraintHorizontal_bias="0.494"
        app:layout_constraintStart_toStartOf="parent"
        app:layout_constraintTop_toBottomOf="@+id/inputId" />

    <Button
        android:id="@+id/btnSendRequest"
        android:layout_width="320dp"
        android:layout_height="wrap_content"
        android:layout_marginTop="20dp"
        android:text="Excluir"
        app:layout_constraintEnd_toEndOf="parent"
        android:backgroundTint="#FF3F3F"
        app:layout_constraintHorizontal_bias="0.505"
        app:layout_constraintStart_toStartOf="parent"
        app:layout_constraintTop_toBottomOf="@+id/logBox" />

    <TextView
        android:id="@+id/logBox"
        android:layout_width="320dp"
        android:layout_height="250dp"
        android:layout_marginTop="40dp"
        android:scrollbars="vertical"
        android:text="Logs:"
        app:layout_constraintEnd_toEndOf="parent"
        app:layout_constraintStart_toStartOf="parent"
        app:layout_constraintTop_toBottomOf="@+id/folderCategories" />
</androidx.constraintlayout.widget.ConstraintLayout>
	

Como usar o exemplo de SMS em Kotlin:

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

Baixar DeleteSms.kt

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

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

O arquivo DeleteSms.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 excluir SMS usando Kotlin
Figura 2 - Diretório DeleteSms.kt

Como excluir SMS com Kotlin (Passos rápidos)

Para excluir SMS com Kotlin:

  1. Instale o Ozeki SMS Gateway
  2. Conecte o Ozeki SMS Gateway à rede móvel
  3. Envie um SMS teste da interface 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 excluir uma mensagem SMS
  9. Use o método Delete para excluir sua mensagem
  10. Leia a mensagem de resposta no console
  11. Verifique os logs no gateway SMS

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

Para poder excluir SMS com Kotlin, primeiro você precisa criar um usuário de API HTTP para SMS. Crie um usuário com o nome "http_user" e a 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 com Kotlin

Para excluir 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 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 excluir SMS com Kotlin

Para autenticar o cliente 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 excluir SMS com Kotlin

Para excluir 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 excluir 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. Ela contém os IDs das mensagens que você deseja excluir.

POST /api?action=deletemsg HTTP/1.1
Connection: Keep-Alive
Content-Length: 73
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

{
	"folder":	"inbox",
	"message_ids":	[
		"f07b71e9-6c4c-8ff1-88a5-3aa9fec74966"
	]
}
	

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. 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: Fri, 18 Jun 2021 08:10:45 GMT
Server: 10/10.3.120
Transfer-Encoding: chunked

{
	"http_code": 200,
	"response_code": "SUCCESS",
	"response_msg": "",
	"data": {
	  "folder": "inbox",
	  "message_ids": [
	    "f07b71e9-6c4c-8ff1-88a5-3aa9fec74966"
	  ]
	}
}
	

Como excluir 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 DeleteSms.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 excluir mensagens SMS usando Kotlin.

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

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

Depois que o SMS foi enviado, é 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 DeleteSms.kt no Android Studio

Usando o aplicativo em um telefone

Na Figura 4, você pode ver como a exclusão de uma mensagem SMS aparece quando você está usando o aplicativo em um telefone. Cole o ID da mensagem na caixa de texto 'ID' e pressione o botão 'Excluir'. Isso excluirá a mensagem escolhida. Se o processo for concluído com sucesso, você verá a mensagem 'true' na seção 'Logs'.

aplicativo de exemplo kotlin para receber mensagens sms
Figura 4 - Aplicativo de exemplo DeleteSms 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.

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

Neste vídeo, apresentamos o processo de adicionar dependências ao seu projeto. O vídeo começará com a cópia do código desta página de tutorial e terminará com as dependências no projeto. Essas dependências são partes cruciais do projeto. Sem elas, o Ozeki.Libs.Rest não funcionará. Este vídeo tem apenas 53 segundos, mas é fácil de entender e seguir.

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

Acesso à internet

Para possibilitar que seu aplicativo envie 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 mencionados anteriormente. 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)

Considerações finais

Este artigo mostra como usar o código Kotlin fornecido para excluir mensagens SMS com o usuário HTTP do Ozeki SMS Gateway. Se você precisa lidar com muitas mensagens SMS diariamente e várias delas são indesejadas, o procedimento mostrado aqui é essencial para você. Um armazenamento frequentemente limpo e, portanto, equilibrado é muito importante em todas as áreas, pois permite um trabalho mais dinâmico e eficiente.

Continue esta jornada instrutiva no site da Ozeki, escolha entre os muitos outros artigos disponíveis. Vamos ler o artigo intitulado Github: API SMS em Kotlin, que trata de um dos repositórios que você pode usar gratuitamente.

Baixe o Ozeki SMS Gateway agora e aplique o que você aprendeu!

More information