Procurar endereço com o CEP em Kotlin

Procurar endereço com o CEP em Kotlin

Nesse tutorial vou descrever como Procurar endereço com o CEP em Kotlin para que você possa aprender a utilizar JSON com pesquisas na internet.

Primeiramente vamos criar um projeto vazio(Empty) para fazer as mudanças e assim conseguir procurar o endereço a partir do CEP.

Se você ainda não sabe como criar um projeto vazio veja então o tutorial Como criar um projeto no Android Studio ou Video 1: Novo projeto e emulador.

Logo depois de criar o projeto vamos então editar o nosso arquivo do AndroidManifest para que possa fazer conexão com a internet deixando o código da seguinte forma.

AndroidManifest

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
   package="br.com.uware.cep">
    <uses-permission android:name="android.permission.INTERNET"/>
    <application
       android:allowBackup="true"
       android:icon="@mipmap/ic_launcher"
       android:label="@string/app_name"
       android:roundIcon="@mipmap/ic_launcher_round"
       android:supportsRtl="true"
       android:theme="@style/AppTheme">
        <activity android:name=".MainActivity">
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />

                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>
    </application>
</manifest>

Vamos agora editar o nosso layout para assim ter os objetos que precisamos e vamos ficar com o código da seguinte forma.

activity_main

<?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">
    <LinearLayout
        android:id="@+id/laySearch"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:orientation="vertical"
        android:layout_margin="20dp"
        app:layout_constraintTop_toTopOf="parent">
        <TextView
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:text="Digite o CEP:"
            app:layout_constraintBottom_toBottomOf="parent"
            app:layout_constraintLeft_toLeftOf="parent"
            app:layout_constraintRight_toRightOf="parent"
            app:layout_constraintTop_toTopOf="parent" />
        <EditText
            android:id="@+id/etCEP"
            android:inputType="number"
            android:gravity="center"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"/>
        <Button
            android:id="@+id/btnSearch"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:text="Pesquisar"/>
    </LinearLayout>
    <ProgressBar
        android:id="@+id/pbCep"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:visibility="invisible"
        app:layout_constraintTop_toBottomOf="@+id/laySearch"
        app:layout_constraintBottom_toBottomOf="parent"
        app:layout_constraintStart_toStartOf="parent"
        app:layout_constraintEnd_toEndOf="parent"/>
    <TextView
        android:id="@+id/tvResp"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:textSize="20sp"
        android:gravity="center"
        android:layout_margin="20dp"
        app:layout_constraintTop_toBottomOf="@+id/laySearch"
        app:layout_constraintBottom_toBottomOf="parent"/>
</androidx.constraintlayout.widget.ConstraintLayout>

Vamos logo após ter modificado o nosso layout vamos fazer a parte da programação dentro da MainActivity e para isso vamos usar uma tarefa assíncrona para fazer a pesquisa na internet.

Vamos deixar o código assim como o a seguir.

MainActivity

class MainActivity : AppCompatActivity() {
    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_main)
        etCEP.addTextChangedListener(MaskEditUtil.mask(etCEP,"#####-###"))
        btnSearch.setOnClickListener {
            if(etCEP.text.toString().length != 9){
                Toast.makeText(this,"CEP precisa ter 8 Digitos", Toast.LENGTH_LONG).show()
            }
            else{
                getCep(etCEP.text.toString())
            }
        }
    }
    fun getCep(cep: String){
        val url= "https://viacep.com.br/ws/"+cep+"/json/"
        tvResp.visibility = View.INVISIBLE
        MyAsyncTask().execute(url)
    }
    object MaskEditUtil {
        fun mask(ediTxt: EditText, mask: String): TextWatcher {
            return object : TextWatcher {
                var isUpdating: Boolean = false
                var old = ""
                override fun afterTextChanged(s: Editable) {}
                override fun beforeTextChanged(s: CharSequence, start: Int, count: Int, after: Int) {}
                override fun onTextChanged(s: CharSequence, start: Int, before: Int, count: Int) {
                    val str = unmask(s.toString())
                    var mascara = ""
                    if (isUpdating) {
                        old = str
                        isUpdating = false
                        return
                    }
                    var i = 0
                    for (m in mask.toCharArray()) {
                        if (m != '#' && str.length > old.length) {
                            mascara += m
                            continue
                        }
                        try {
                            mascara += str[i]
                        } catch (e: Exception) {
                            break
                        }
                        i++
                    }
                    isUpdating = true
                    ediTxt.setText(mascara)
                    ediTxt.setSelection(mascara.length)
                }
            }
        }
        fun unmask(s: String): String {
            return s.replace("[-]".toRegex(), "")
        }
    }
    inner class MyAsyncTask: AsyncTask<String, String, String>() {
        override fun onPreExecute() {
            pbCep.visibility = View.VISIBLE
        }
        override fun doInBackground(vararg params: String?): String {
            try {
                val url = URL(params[0])
                val urlConnection = url.openConnection() as HttpURLConnection
                urlConnection.connectTimeout = 7000
                var instring = ConvertStreamString(urlConnection.inputStream)
                publishProgress(instring)
            } catch (ex: Exception) {
                Log.d("Erro: ", ex.toString())
            }
            return ""
        }
        override fun onProgressUpdate(vararg params: String?) {
            try {
                var json = JSONObject(params[0])
                val cep = json.getString("cep")
                val logradouro = json.getString("logradouro")
                val bairro = json.getString("bairro")
                val cidade = json.getString("localidade")
                val estado = json.getString("uf")
                pbCep.visibility = View.INVISIBLE
                tvResp.visibility = View.VISIBLE
                tvResp.text =
                    "Dados\ncep: " + cep + "\nRua: " + logradouro + "\nBairro: " + bairro + "\nCidade: " + cidade + "\nEstado: " + estado
            } catch (ex: Exception) {
                Log.d("Erro: ", ex.toString())
            }
        }
        fun ConvertStreamString(inputStream: InputStream): String {
            val reader = BufferedReader(inputStream.reader())
            val content = StringBuilder()
            var line = reader.readLine()
            try {
                while (line != null) {
                    content.append(line)
                    line = reader.readLine()
                }
            } finally {
                reader.close()
            }
            return content.toString()
        }
    }
}

Então chegou a hora de compilar e executar o projeto para ver como funciona para pegar o endereço a partir do CEP.

Foi criado um gist do nosso projeto para facilitar, então se sovê quiser clonar nosso projeto você pode utilizar a seguinte linha para isso.

[user@uware ~]$ git clone https://github.com/uware-com-br/CEP_Kotlin

Assim você vai precisar digitar o seguinte comando quando for atualizar seu repositório.

[user@uware ~]$ git pull

E assim seu repositório será atualizado.

Enfim espero poder ter ajudado com mais este tutorial sobre Procurar endereço com o CEP em Kotlin.

Fonte:

Veja também nossos vídeos e siga o nosso canal no YouTube:

Ainda assim se estiver com alguma dúvida entre em nosso canal no telegram clicando no link abaixo.




Rodrigo Leutz
Desenvolvedor Web e Android ( Kotlin e Java )