ENVIO DE SMS MASIVO 3

Te regalo un sistema de envio masivo de sms

🚀 “Te regalo un sistema de envío masivo de SMS: ¡Porque tus textos merecen ser leídos por el mundo entero!” 🌍

¿Recuerdas esos tiempos donde enviar un mensaje de texto era casi un ritual? Tenías que pulsar mil veces el mismo botón para escribir una simple palabra y cruzar los dedos para que llegara a tiempo. ¡Pues bien! Ahora, con la magia del siglo XXI (y un poquito de ayuda de tu servidor), puedes enviar SMS en MASIVO. Sí, has leído bien, ¡en MASIVO! 🎉

¿Eres el elegido para una misión importante? ¿Tienes que avisar a todos tus amigos del último chisme? ¿O quizás sólo quieres ser el rey o reina de las bromas en tu grupo? Sea cual sea tu motivo, esta herramienta es lo que necesitas.

Pero espera, ¡hay más! No sólo te ofrecemos la posibilidad de enviar mensajes como si no hubiera un mañana. También lo hacemos de la forma más fácil y rápida que te puedas imaginar, gracias a esta magnífica aplicación creada en el majestuoso Android Studio. 🎩✨

¿Y sabes lo mejor? No tienes que romper tu alcancía ni vender un riñón para tenerlo. Simplemente haz clic en el boton de abajo y sigue los pasos que te muestro a continuacion.

Pasos a seguir

Descargamos la aplicación aqui

image 6
Descargamos sistema de envio masivo de sms

image 7
Se mostrará el botón configuración y le damos clic

image 8
Habiltamos chrome

image 9
Damos click en instalar

image 10
Damos click en permitir permisos

image 11
Vamos a https://pastebin.com y pegamos un texto algo asi con con el numero de telefono el nombre y el mensaje y damos click en guardar

Codigo a pegar

527121122441,Eugenio, Espero que estés bien te quiero comunicar que ...
527121122441,Eugenio2, Espero que estés bien te queremos decir ...
527121122441,Eugenio3, Espero que estés bien te queremos decir ...
image 12
Copiamos la url y la pegamos en nuestra app

sistema de envio masivo de sms
Telefono a notificar, el telefono de la sim1 y el telefono de la sim2

Codigo de sistema de envio masivo de sms

MainActivity.kt

/*
sistema de envio masivo de sms
*/
package com.example.enviar_sms2
import android.Manifest
import android.app.Activity
import android.app.PendingIntent
import android.content.BroadcastReceiver
import android.content.Context
import android.content.Intent
import android.content.IntentFilter
import android.content.pm.PackageManager
import android.graphics.Color
import android.media.Ringtone
import android.media.RingtoneManager
import android.os.Build
import android.os.Bundle
import android.os.CountDownTimer
import android.telephony.SmsManager
import android.telephony.SubscriptionManager
import android.text.method.ScrollingMovementMethod
import android.view.View
import android.view.WindowManager
import android.widget.AdapterView
import android.widget.ArrayAdapter
import android.widget.Button
import android.widget.CheckBox
import android.widget.EditText
import android.widget.ProgressBar
import android.widget.RadioButton
import android.widget.RadioGroup
import android.widget.Spinner
import android.widget.TextView
import android.widget.Toast
import androidx.appcompat.app.AlertDialog
import androidx.appcompat.app.AppCompatActivity
import androidx.core.app.ActivityCompat
import androidx.core.content.ContextCompat
import com.android.volley.Request
import com.android.volley.toolbox.JsonArrayRequest
import com.android.volley.toolbox.JsonObjectRequest
import com.android.volley.toolbox.Volley
import org.json.JSONArray
import org.json.JSONObject
import java.util.Calendar
import java.util.Random
import android.app.Application
import com.android.volley.RequestQueue
import com.android.volley.toolbox.StringRequest
class MainActivity : AppCompatActivity() {
    lateinit var txtUrl: EditText
    lateinit var evMuestraTels: EditText
    lateinit var phoneNumberEditText:EditText
    lateinit var messageEditText:EditText
    lateinit var sendButton:Button
    lateinit var txtHoraIni:EditText
    lateinit var txtHoraFin:EditText
    lateinit var SimTel1:EditText
    lateinit var SimTel2:EditText
    lateinit var etNombreEquipo:EditText
    lateinit var edNumeroNotificar:EditText
    lateinit var radioGroupSim: RadioGroup
    lateinit var radioButtonSim1: RadioButton
    lateinit var radioButtonSim2: RadioButton
    private lateinit var txtTiempoReset: EditText
    private lateinit var txtTeimpoEspera:EditText
    private lateinit var activaReg: CheckBox
    private lateinit var chEnviaSMS: CheckBox
    private lateinit var tvMuestraReg: TextView
    private lateinit var spListaMensajes: Spinner
    private lateinit var tvNotificaHora: TextView
    private lateinit var tvNotifica: TextView
    private var timer: CountDownTimer? = null
    private var contadorReinicia=0;
    private var contador=0;
    private var currentRingtone: Ringtone? = null
    //private lateinit var sharedPref: SharedPreferences

    private var simSubIds = IntArray(2) { -1 }
    companion object {
        const val SMS_PERMISSION_CODE = 1
    }

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_main)
        //MANTENER ACTIVA LA PANTALLA
        window.addFlags(WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON)
        txtUrl = findViewById<EditText>(R.id.txtUrl)
        evMuestraTels = findViewById<EditText>(R.id.evMuestraTels)
        evMuestraTels.movementMethod = ScrollingMovementMethod()
        txtHoraIni = findViewById<EditText>(R.id.txtHoraIni)
        txtHoraFin = findViewById<EditText>(R.id.txtHoraFin)
        txtTiempoReset = findViewById(R.id.txtTiempoReset)
        txtTeimpoEspera = findViewById<EditText>(R.id.txtTeimpoEspera)
        activaReg = findViewById(R.id.activaReg)
        chEnviaSMS = findViewById(R.id.chEnviaSMS)
        tvMuestraReg = findViewById(R.id.tvMuestraReg)
        SimTel1 = findViewById<EditText>(R.id.SimTel1)
        SimTel2 = findViewById<EditText>(R.id.SimTel2)
        etNombreEquipo = findViewById<EditText>(R.id.etNombreEquipo)
        edNumeroNotificar = findViewById<EditText>(R.id.edNumeroNotificar)
        radioGroupSim = findViewById(R.id.radioGroupSim)
        radioButtonSim1 = findViewById(R.id.radioButtonSim1)
        radioButtonSim2 = findViewById(R.id.radioButtonSim2)
        tvNotificaHora = findViewById<TextView>(R.id.tvNotificaHora)
        tvNotifica = findViewById<TextView>(R.id.tvNotifica)
        val sharedPref = getSharedPreferences("MyPrefs", Context.MODE_PRIVATE)
        // 120 es el valor predeterminado en caso de que no haya nada guardado.
        val savedTime = sharedPref.getString("timeReset", "120")
        txtTiempoReset.setText(savedTime)
        val txtTeimpoEsperaShare = sharedPref.getString("txtTeimpoEspera", "10")
        txtTeimpoEspera.setText(txtTeimpoEsperaShare)
        //AL HACER CLICK EN EL CHECK DE LA CUENTA REGRESIVA INICIA LA CUENTA ATRAS PARA ENVIAR MENSAJES
        activaReg.setOnCheckedChangeListener { _, isChecked ->
            if (isChecked) {
                val sharedPref = getSharedPreferences("MyPrefs", Context.MODE_PRIVATE)
                with(sharedPref.edit()) {
                    putString("timeReset", txtTiempoReset.text.toString())
                    putString("txtTeimpoEspera", txtTeimpoEspera.text.toString())
                    apply()
                }
                startCountDown()
            } else {
                timer?.cancel()
            }
        }
        simSubIds  = checkSIMs()
        if (simSubIds[0] != -1) {
            Toast.makeText(this, "SIM 1 presente con subId ${simSubIds[0]}", Toast.LENGTH_SHORT).show()
        }
        if (simSubIds[1] != -1) {
            Toast.makeText(this, "SIM 2 presente con subId ${simSubIds[1]}", Toast.LENGTH_SHORT).show()
        }
        radioButtonSim1.text = simSubIds[0].toString()
        radioButtonSim2.text = simSubIds[1].toString()
        if (simSubIds[0] != -1) {
            radioButtonSim1.isChecked = true
        } else if (simSubIds[1] != -1) {
            radioButtonSim2.isChecked = true
        } else {
            radioButtonSim1.isEnabled = false
            radioButtonSim2.isEnabled = false
        }
        cargarValoresDeSharedPreferences()
        if (ContextCompat.checkSelfPermission(this, Manifest.permission.RECEIVE_SMS) != PackageManager.PERMISSION_GRANTED) {
            ActivityCompat.requestPermissions(this, arrayOf(Manifest.permission.RECEIVE_SMS), 1001)
        }
        phoneNumberEditText = findViewById(R.id.phoneNumberEditText)
        if (ContextCompat.checkSelfPermission(this, Manifest.permission.SEND_SMS)
            != PackageManager.PERMISSION_GRANTED) {
            ActivityCompat.requestPermissions(this,
                arrayOf(Manifest.permission.SEND_SMS), SMS_PERMISSION_CODE)
        }
        val sharedPrefTel = getSharedPreferences("myPrefs", Context.MODE_PRIVATE)
        val savedPhoneNumber = sharedPrefTel.getString("phoneNumber", "")
        cargarValoresSimTel()
        cargarDatosEquipo()
        phoneNumberEditText.setText(savedPhoneNumber)
    }
    private fun startCountDown() {
        val timeMillis = txtTiempoReset.text.toString().toLongOrNull() ?: return
        val timeInMilliSeconds = timeMillis * 1000

        timer = object : CountDownTimer(timeInMilliSeconds, 1000) {
            override fun onTick(millisUntilFinished: Long) {
                val secondsRemaining = millisUntilFinished / 1000
                tvMuestraReg.text = "$secondsRemaining"
            }
            override fun onFinish() {
                tvMuestraReg.text = "Tiempo terminado"
                // Reiniciar la cuenta regresiva si el CheckBox aún está marcado
                if (activaReg.isChecked) {
                    //EXTRAEMOS LA HORA ACTUAL
                    val currentHour = Calendar.getInstance().get(Calendar.HOUR_OF_DAY)
                    //OBTENEMOS LA HORA EN LA QUE ESTA PERMITIDI ENVIAR SMS
                    val horaIni = txtHoraIni.text.toString().toIntOrNull() ?: 0
                    val horaFin = txtHoraFin.text.toString().toIntOrNull() ?: 0
                    //SI LA HORA ACTUAL ESTA FUERA DEL RANGO PERMITIDO DESACTIVAMOS EL CHECK Y DETENEMOS LA CUENTA REGRESIVA
                    if (currentHour !in horaIni..(horaFin-1)) {
                        chEnviaSMS.isChecked = false
                        chEnviaSMS.setBackgroundColor(Color.parseColor("#FF0000"))
                        tvNotificaHora.text="SON LAS $currentHour Y SOLO SE PUEDEN ENVIAR SMS ENTRE $horaIni Y $horaFin"
                        //timer?.cancel()
                        //showAlertError("SON LAS $currentHour Y SOLO SE PUEDEN ENVIAR SMS ENTRE $horaIni Y $horaFin");
                        //return@onFinish
                    }
                    //SI LA HORA ACTUAL ESTA DENTRO DEL RANGO PERMITIDO ACTIVAMOS EL ENVIO DE SMS
                    else{
                        chEnviaSMS.isChecked = true
                        chEnviaSMS.setBackgroundColor(Color.parseColor("#00FF00"))
                        tvNotificaHora.text="SON LAS $currentHour ESTA DENTRO DEL HORARIO $horaIni Y $horaFin"
                    }
                    evMuestraTels.setText("")
                    //SI ESTA ACTIVO EL ENVIAR SMS SE ENVIA EL SMS
                    if(chEnviaSMS.isChecked==true){
                        //ENVIAMOS EL SMS
                        enviaSmsServidor();
                        //CADA x CICLOS NOTIFICARNOS CON UN SMS
                        var numeroNotificar= edNumeroNotificar.text.toString().toInt()
                        if(contadorReinicia>=numeroNotificar){
                            var txtTeimpoEsperaL=txtTeimpoEspera.text.toString().toLong()
                            txtTeimpoEsperaL *= 1000L
                            pausa(txtTeimpoEsperaL)
                            val tel =phoneNumberEditText.text.toString()
                            if (tel.trim().isNotEmpty()) {
                                val etNombreEquipoS=etNombreEquipo.text.toString()
                                val sim1=simSubIds[0]
                                val sim2=simSubIds[1]
                                if (sim1 != -1) {
                                    sendSms(tel, "Enviado desde \"$etNombreEquipoS\" $contador",sim1){enviado1 ->
                                        if (enviado1) {
                                        }
                                        else {
                                            activaReg.isChecked = false
                                            timer?.cancel()
                                            showAlertError("NO SE PUDO ENVIAR EL MENSAJE HACIA $tel DESDE LA SIM $sim1");
                                            playDefaultNotificationSound(RingtoneManager.TYPE_ALARM)
                                            return@sendSms
                                        }
                                    }
                                }
                                pausa(4000L)
                                if (sim2 != -1) {
                                    sendSms(tel, "Enviado desde \"$etNombreEquipoS\" $contador",sim2){enviado2 ->
                                        if (enviado2) {
                                        }
                                        else {
                                            activaReg.isChecked = false
                                            timer?.cancel()
                                            showAlertError("NO SE PUDO ENVIAR EL MENSAJE HACIA $tel DESDE LA SIM $sim2");
                                            playDefaultNotificationSound(RingtoneManager.TYPE_ALARM)
                                            return@sendSms
                                        }
                                    }
                                }

                            }
                            contadorReinicia=0
                        }
                        contadorReinicia++
                        contador++
                        tvNotifica.text="ciclos $contador"
                    }
                    startCountDown()
                }
            }
        }.start()
    }
    fun enviarUnMensaje(view: View){
        if (ContextCompat.checkSelfPermission(this, Manifest.permission.SEND_SMS)
            != PackageManager.PERMISSION_GRANTED) {
            ActivityCompat.requestPermissions(this,
                arrayOf(Manifest.permission.SEND_SMS), SMS_PERMISSION_CODE)
        } else {
            val selectedId = radioGroupSim.checkedRadioButtonId

            val selectedValue: String? = when (selectedId) {
                R.id.radioButtonSim1 -> radioButtonSim1.text.toString()
                R.id.radioButtonSim2 -> radioButtonSim2.text.toString()
                else -> null
            }
            val numSim =selectedValue.toString().toInt()
            sendSms(phoneNumberEditText.text.toString(), messageEditText.text.toString(),numSim){ success ->
                if (success) {
                    Toast.makeText(this, "SMS enviado exitosamente", Toast.LENGTH_SHORT).show()
                    view.setBackgroundColor(Color.parseColor("#4CAF50")) // Verde
                } else {
                    Toast.makeText(this, "Error al enviar SMS", Toast.LENGTH_SHORT).show()
                    view.setBackgroundColor(Color.parseColor("#F44336")) // Rojo
                }
            }
        }
    }
    fun btnguardarTelefono(view: View){
        val phoneNumber = phoneNumberEditText.text.toString()
        val sharedPrefTel = getSharedPreferences("myPrefs", Context.MODE_PRIVATE)
        val editor = sharedPrefTel.edit()
        editor.putString("phoneNumber", phoneNumber)
        editor.apply()
        Toast.makeText(this, "Numero guardado exitosamente", Toast.LENGTH_SHORT).show()
    }
    fun btnGuardaEquipo(view: View){
        val sharedPreferences = getSharedPreferences("datosEquipoPreferences", Context.MODE_PRIVATE)
        val editor = sharedPreferences.edit()

        // Obtener el estado del CheckBox
        val isChEnviaSMSChecked = chEnviaSMS.isChecked

        editor.putString("etNombreEquipo", etNombreEquipo.text.toString())
        editor.putString("edNumeroNotificar", edNumeroNotificar.text.toString())
        editor.putBoolean("chEnviaSMS", isChEnviaSMSChecked)

        editor.apply()

        Toast.makeText(this, "Valores guardados correctamente", Toast.LENGTH_SHORT).show()
    }
    fun cargarDatosEquipo() {
        val sharedPreferences = getSharedPreferences("datosEquipoPreferences", Context.MODE_PRIVATE)
        val randomNumber = Random().nextInt( 200)
        val etNombreEquipoS = sharedPreferences.getString("etNombreEquipo", "Equipo $randomNumber")
        val edNumeroNotificarS = sharedPreferences.getString("edNumeroNotificar", "5")
        val isChEnviaSMSChecked = sharedPreferences.getBoolean("chEnviaSMS", true)
        chEnviaSMS.isChecked = isChEnviaSMSChecked
        colocreaChEnviaSMS()
        etNombreEquipo.setText(etNombreEquipoS)
        edNumeroNotificar.setText(edNumeroNotificarS)
    }
    fun clickChEnviaSMS(view: View){
        colocreaChEnviaSMS()
    }
    fun colocreaChEnviaSMS(){
        if(chEnviaSMS.isChecked){
            chEnviaSMS.setBackgroundColor(Color.parseColor("#00FF00"))
        }else{
            chEnviaSMS.setBackgroundColor(Color.parseColor("#FF0000"))
        }
    }
    fun sendSms(phoneNumber: String, message: String, subId: Int, callback: (Boolean) -> Unit) {
        val intent = Intent("SMS_SENT")
        val flags = if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.S) {
            PendingIntent.FLAG_IMMUTABLE
        } else {
            0
        }
        val sentPI = PendingIntent.getBroadcast(this, 0, intent, flags)

        val smsManager = SmsManager.getSmsManagerForSubscriptionId(subId)
        smsManager.sendTextMessage(phoneNumber, null, message, sentPI, null)

        val receiver = object : BroadcastReceiver() {
            override fun onReceive(context: Context?, intent: Intent?) {
                unregisterReceiver(this)  // Desregistrar el receiver
                when (resultCode) {
                    Activity.RESULT_OK -> callback(true)
                    else -> callback(false)
                }
            }
        }

        registerReceiver(receiver, IntentFilter("SMS_SENT"))
        Toast.makeText(this, "Mensaje enviado desde $subId", Toast.LENGTH_SHORT).show()
    }
    fun checkSIMs(): IntArray  {
        val simSubIds = IntArray(2) { -1 }  // Por defecto ambos tienen valor -1, indicando que no hay SIM presente

        // Comprobar permisos
        if (ContextCompat.checkSelfPermission(this, Manifest.permission.READ_PHONE_STATE) != PackageManager.PERMISSION_GRANTED) {
            // Solicitar permiso y regresar valores por defecto
            // Es importante manejar la solicitud de permisos de forma asincrónica
            val REQUEST_CODE = 1234
            ActivityCompat.requestPermissions(this, arrayOf(Manifest.permission.READ_PHONE_STATE), REQUEST_CODE)
            return simSubIds
        }

        val subscriptionManager = getSystemService(Context.TELEPHONY_SUBSCRIPTION_SERVICE) as SubscriptionManager
        val subscriptionInfoList = subscriptionManager.activeSubscriptionInfoList

        if (subscriptionInfoList != null) {
            for (info in subscriptionInfoList) {
                when (info.simSlotIndex) {
                    0 -> simSubIds[0] = info.subscriptionId  // Guardar subId de la SIM 1
                    1 -> simSubIds[1] = info.subscriptionId  // Guardar subId de la SIM 2
                }
            }
        }

        return simSubIds
    }
    fun enviaSmsServidor() {
        val SimTel1Value = SimTel1.text.toString()
        val SimTel2Value = SimTel2.text.toString()
        val progressBar = findViewById<ProgressBar>(R.id.progressBar)
        progressBar.visibility = View.VISIBLE

        val queue = Volley.newRequestQueue(this)
        val url = txtUrl.text.toString()

        val stringRequest = StringRequest(
            Request.Method.GET, url,
            { response ->
                val lines = response.split("\n")
                val totalMensajes = lines.size

                val mensajesSIM1: Int
                val mensajesSIM2: Int

                when {
                    simSubIds[0] != -1 && simSubIds[1] != -1 -> {
                        mensajesSIM1 = totalMensajes / 2
                        mensajesSIM2 = totalMensajes - mensajesSIM1
                    }
                    simSubIds[0] != -1 -> {
                        mensajesSIM1 = totalMensajes
                        mensajesSIM2 = 0
                    }
                    simSubIds[1] != -1 -> {
                        mensajesSIM1 = 0
                        mensajesSIM2 = totalMensajes
                    }
                    else -> {
                        mensajesSIM1 = 0
                        mensajesSIM2 = 0
                    }
                }

                for (i in lines.indices) {
                    val columns = lines[i].split(",")

                    val telefonoOriginal = columns[0]
                    val displayName = columns[1]
                    var descripcionPlantillaSeleccionada = columns[2]
                    val textoEnviar="Hola "+displayName+" "+descripcionPlantillaSeleccionada
                    var telefono = telefonoOriginal
                    if (telefono.startsWith("52")) {
                        telefono = telefono.substring(2)
                    }

                    var subIdToSend = -1
                    if (i < mensajesSIM1) {
                        subIdToSend = simSubIds[0]
                    } else {
                        subIdToSend = simSubIds[1]
                    }

                    try {
                        sendSms(telefono, textoEnviar, subIdToSend)
                        evMuestraTels.setText("${evMuestraTels.text}$telefono | $displayName | $subIdToSend\n")

                        val userRecord = JSONObject().apply {
                            put("ID", telefonoOriginal)
                            if (subIdToSend == simSubIds[0]) {
                                put("phoneNumber", SimTel1Value)
                            } else {
                                put("phoneNumber", SimTel2Value)
                            }
                        }
                    } catch (e: Exception) {
                        showAlertError(e.message)
                    }

                    val txtTiempoEsperaL = txtTeimpoEspera.text.toString().toLong() * 1000L
                    Thread.sleep(txtTiempoEsperaL)
                }

                progressBar.visibility = View.GONE
            },
            { error ->
                error.printStackTrace()
                progressBar.visibility = View.GONE
            }
        )

        queue.add(stringRequest)
        playDefaultNotificationSound(RingtoneManager.TYPE_NOTIFICATION)
    }

    fun playDefaultNotificationSound(tipoTono:Int) {
        val notification = RingtoneManager.getDefaultUri(tipoTono)
        currentRingtone = RingtoneManager.getRingtone(applicationContext, notification)
        currentRingtone?.play()
    }
    fun clickEnviaSms(view:View){
        evMuestraTels.setText("")
        enviaSmsServidor();
    }


    // Función de pausa
    fun pausa(sleeptime: Long) {
        try {
            Thread.sleep(sleeptime)
        } catch (e: InterruptedException) {
        }
    }
    fun sendSms(phoneNumber: String, message: String, subId: Int) {
        val smsManager = SmsManager.getSmsManagerForSubscriptionId(subId)
        smsManager.sendTextMessage(phoneNumber, null, message, null, null)
        Toast.makeText(this, "Mensaje enviado desde $subId", Toast.LENGTH_SHORT).show()
    }

    fun btnGuardaLim(view: View){
        val txtHoraIniS=txtHoraIni.text.toString()
        val txtHoraFinS=txtHoraFin.text.toString()
        guardarEnSharedPreferences(txtHoraIniS,txtHoraFinS)
    }
    fun guardarEnSharedPreferences(horaIni: String,horaFin: String) {
        val sharedPreferences = getSharedPreferences("misPreferencias", Context.MODE_PRIVATE)
        val editor = sharedPreferences.edit()
        editor.putString("horaIni", horaIni)
        editor.putString("horaFin", horaFin)
        editor.apply()
        val sharedPref = getSharedPreferences("MyPrefs", Context.MODE_PRIVATE)
        with(sharedPref.edit()) {
            putString("timeReset", txtTiempoReset.text.toString())
            putString("txtTeimpoEspera", txtTeimpoEspera.text.toString())
            apply()
        }

        Toast.makeText(this, "Datos guardados con éxito", Toast.LENGTH_SHORT).show()
    }
    fun cargarValoresDeSharedPreferences() {
        val sharedPreferences = getSharedPreferences("misPreferencias", Context.MODE_PRIVATE)
        val limiteGuardado = sharedPreferences.getString("LIMITE", "0")  // El segundo parámetro es un valor por defecto en caso de que no exista.
        val offsetGuardado = sharedPreferences.getString("OFFSET", "10")  // El segundo parámetro es un valor por defecto en caso de que no exista.
        val txtHoraIniGuardado = sharedPreferences.getString("horaIni", "8")  // El segundo parámetro es un valor por defecto en caso de que no exista.
        val txtHoraFinGuardado = sharedPreferences.getString("horaFin", "20")  // El segundo parámetro es un valor por defecto en caso de que no exista.

        txtHoraIni.setText(txtHoraIniGuardado)
        txtHoraFin.setText(txtHoraFinGuardado)
    }
    override fun onRequestPermissionsResult(requestCode: Int, permissions: Array<String>,
                                            grantResults: IntArray) {
        if (requestCode == SMS_PERMISSION_CODE) {
            if (grantResults.isNotEmpty() && grantResults[0] == PackageManager.PERMISSION_GRANTED) {
                Toast.makeText(this, "Permiso concedido", Toast.LENGTH_SHORT).show()
            } else {
                Toast.makeText(this, "Permiso denegado", Toast.LENGTH_SHORT).show()
            }
        }
        when (requestCode) {
            1001 -> {
                if (grantResults.isNotEmpty() && grantResults[0] == PackageManager.PERMISSION_GRANTED) {
                    Toast.makeText(this, "Permiso leer mensajes concedido", Toast.LENGTH_SHORT).show()
                } else {
                    Toast.makeText(this, "Permiso leer mensajes denegado", Toast.LENGTH_SHORT).show()
                }
            }
        }
        super.onRequestPermissionsResult(requestCode, permissions, grantResults)
    }
    private fun showAlertError(message: String?) {
        val builder = AlertDialog.Builder(this)
        builder.setTitle("Error")
        builder.setMessage(message ?: "Un error desconocido ha ocurrido.")
        builder.setPositiveButton("OK") { dialog, _ ->
            currentRingtone?.stop()
            dialog.dismiss()
        }
        builder.show()
    }
    fun GuardarSimTel(view: View) {
        val sharedPreferences = getSharedPreferences("simTelPreferences", Context.MODE_PRIVATE)
        val editor = sharedPreferences.edit()

        editor.putString("simTel1Value", SimTel1.text.toString())
        editor.putString("simTel2Value", SimTel2.text.toString())

        editor.apply()

        Toast.makeText(this, "Valores guardados correctamente", Toast.LENGTH_SHORT).show()
    }
    fun cargarValoresSimTel() {
        val sharedPreferences = getSharedPreferences("simTelPreferences", Context.MODE_PRIVATE)
        val simTel1Value = sharedPreferences.getString("simTel1Value", "")
        val simTel2Value = sharedPreferences.getString("simTel2Value", "")

        SimTel1.setText(simTel1Value)
        SimTel2.setText(simTel2Value)
    }
    //al hacer click en el boton btnColocarMensajes tomar el item del spListaMensajes que esta seleccionado y colocarlo en  el edittext messageEditText
}

activity_main.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">

    <!-- Otros componentes ya existentes -->

    <EditText
        android:id="@+id/evMuestraTels"
        android:layout_width="403dp"
        android:layout_height="wrap_content"
        android:drawableStart="@android:drawable/ic_menu_sort_by_size"
        android:hint="Lista telefonos enviados"
        android:inputType="textMultiLine"
        android:maxLines="4"
        android:overScrollMode="ifContentScrolls"
        android:scrollbars="vertical"
        android:textIsSelectable="true"
        app:layout_constraintEnd_toEndOf="parent"
        app:layout_constraintHorizontal_bias="0.498"
        app:layout_constraintStart_toStartOf="parent"
        app:layout_constraintTop_toBottomOf="@+id/linearLayout2" />

    <LinearLayout
        android:id="@+id/linearLayout"
        android:layout_width="0dp"
        android:layout_height="57dp"
        android:orientation="horizontal"
        app:layout_constraintEnd_toEndOf="parent"
        app:layout_constraintStart_toStartOf="parent"
        app:layout_constraintTop_toBottomOf="@+id/txtUrl">

        <EditText
            android:id="@+id/txtHoraIni"
            android:layout_width="120dp"
            android:layout_height="wrap_content"
            android:layout_weight="1"
            android:drawableStart="@android:drawable/ic_menu_recent_history"
            android:ems="10"
            android:hint="HoraIni"
            android:inputType="number|numberDecimal"
            android:text="9"
            android:textSize="14sp" />

        <EditText
            android:id="@+id/txtHoraFin"
            android:layout_width="120dp"
            android:layout_height="wrap_content"
            android:layout_weight="1"
            android:drawableStart="@android:drawable/ic_menu_recent_history"
            android:ems="10"
            android:hint="HoraFin"
            android:inputType="number|numberDecimal"
            android:text="20"
            android:textSize="14sp" />

        <Button
            android:id="@+id/btnGuardaLim"
            android:layout_width="80dp"
            android:layout_height="48dp"
            android:layout_weight="1"
            android:drawableBottom="@android:drawable/ic_menu_save"
            android:onClick="btnGuardaLim" />

    </LinearLayout>

    <LinearLayout
        android:id="@+id/linearLayout2"
        android:layout_width="0dp"
        android:layout_height="50dp"
        android:layout_marginTop="14dp"
        android:gravity="center"
        android:orientation="horizontal"
        app:layout_constraintEnd_toEndOf="parent"
        app:layout_constraintStart_toStartOf="parent"
        app:layout_constraintTop_toBottomOf="@+id/linearLayout">

        <EditText
            android:id="@+id/txtTiempoReset"
            android:layout_width="130dp"
            android:layout_height="wrap_content"
            android:layout_weight="1"
            android:drawableStart="@android:drawable/ic_menu_recent_history"
            android:ems="10"
            android:hint="T. resetear"
            android:inputType="number|numberDecimal"
            android:textSize="14sp" />

        <EditText
            android:id="@+id/txtTeimpoEspera"
            android:layout_width="120sp"
            android:layout_height="wrap_content"
            android:layout_weight="1"
            android:drawableStart="@android:drawable/ic_menu_recent_history"
            android:ems="10"
            android:hint="T. espera"
            android:inputType="number|numberDecimal"
            android:textSize="14sp" />

        <CheckBox
            android:id="@+id/activaReg"
            android:layout_width="80dp"
            android:layout_height="50dp"
            android:text="Cuent reg"
            tools:text="Cuenta reg" />

        <TextView
            android:id="@+id/tvMuestraReg"
            android:layout_width="70dp"
            android:layout_height="25dp"
            android:text="Tiempo resta"
            android:textColor="#FF0000"
            android:textSize="18sp"
            tools:text="Tiempo resta" />

        <Button
            android:id="@+id/btnEnviaSmsServ"
            android:layout_width="48dp"
            android:layout_height="48dp"
            android:drawableBottom="@android:drawable/ic_menu_slideshow"
            android:onClick="clickEnviaSms" />

    </LinearLayout>

    <ProgressBar
        android:id="@+id/progressBar"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:indeterminate="true"
        android:indeterminateDrawable="@android:drawable/progress_indeterminate_horizontal"
        android:visibility="gone"
        app:layout_constraintEnd_toEndOf="parent"
        app:layout_constraintStart_toStartOf="parent"
        app:layout_constraintTop_toTopOf="parent"
        app:layout_constraintBottom_toBottomOf="parent"/>

    <LinearLayout
        android:id="@+id/linearLayout3"
        android:layout_width="0dp"
        android:layout_height="60dp"
        android:layout_marginTop="5dp"
        android:gravity="center"
        android:orientation="horizontal"
        app:layout_constraintEnd_toEndOf="parent"
        app:layout_constraintStart_toStartOf="parent"
        app:layout_constraintTop_toBottomOf="@+id/evMuestraTels">

        <TextView
            android:id="@+id/textView2"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_weight="1"
            android:text="Sel sim" />

        <RadioGroup
            android:id="@+id/radioGroupSim"
            android:layout_width="100sp"
            android:layout_height="wrap_content"
            android:orientation="horizontal">

            <RadioButton
                android:id="@+id/radioButtonSim1"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content" />

            <RadioButton
                android:id="@+id/radioButtonSim2"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content" />

        </RadioGroup>

        <EditText
            android:id="@+id/phoneNumberEditText"
            android:layout_width="180dp"
            android:layout_height="wrap_content"
            android:drawableStart="@android:drawable/ic_menu_call"
            android:hint="Número de teléfono"
            android:inputType="phone" />

        <Button
            android:id="@+id/btnguardarTelefono"
            android:layout_width="40dp"
            android:layout_height="50dp"
            android:layout_weight="1"
            android:drawableBottom="@android:drawable/ic_menu_save"
            android:onClick="btnguardarTelefono" />

    </LinearLayout>

    <LinearLayout
        android:id="@+id/linearLayout6"
        android:layout_width="0dp"
        android:layout_height="50dp"
        android:orientation="horizontal"
        app:layout_constraintEnd_toEndOf="parent"
        app:layout_constraintStart_toStartOf="parent"
        app:layout_constraintTop_toBottomOf="@+id/linearLayout3">

        <EditText
            android:id="@+id/SimTel1"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_weight="1"
            android:drawableLeft="@android:drawable/stat_sys_phone_call"
            android:ems="10"
            android:hint="SimTelefono1"
            android:inputType="number" />

        <EditText
            android:id="@+id/SimTel2"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_weight="1"
            android:drawableLeft="@android:drawable/stat_sys_phone_call"
            android:ems="10"
            android:hint="SimTelefono2"
            android:inputType="number" />

        <Button
            android:id="@+id/GuardarSimTel"
            android:layout_width="80dp"
            android:layout_height="wrap_content"
            android:layout_weight="1"
            android:drawableBottom="@android:drawable/ic_menu_save"
            android:onClick="GuardarSimTel" />
    </LinearLayout>

    <LinearLayout
        android:id="@+id/linearLayout4"
        android:layout_width="0dp"
        android:layout_height="50dp"
        android:layout_marginTop="1dp"
        android:orientation="horizontal"
        app:layout_constraintEnd_toEndOf="parent"
        app:layout_constraintStart_toStartOf="parent"
        app:layout_constraintTop_toBottomOf="@+id/linearLayout6">

        <EditText
            android:id="@+id/etNombreEquipo"
            android:layout_width="160dp"
            android:layout_height="wrap_content"
            android:layout_weight="1"
            android:ems="10"
            android:hint="Nombre equipo"
            android:inputType="text" />

        <EditText
            android:id="@+id/edNumeroNotificar"
            android:layout_width="90dp"
            android:layout_height="wrap_content"
            android:layout_weight="1"
            android:ems="10"
            android:hint="# Notificar"
            android:inputType="number|numberDecimal" />

        <CheckBox
            android:id="@+id/chEnviaSMS"
            android:layout_width="100dp"
            android:layout_height="60sp"
            android:layout_weight="1"
            android:checked="true"
            android:onClick="clickChEnviaSMS"
            android:text="Envia SMS" />

        <Button
            android:id="@+id/btnGuardaEquipo"
            android:layout_width="50dp"
            android:layout_height="wrap_content"
            android:layout_weight="1"
            android:drawableBottom="@android:drawable/ic_menu_save"
            android:onClick="btnGuardaEquipo" />
    </LinearLayout>

    <LinearLayout
        android:layout_width="0dp"
        android:layout_height="61dp"
        android:layout_marginTop="1dp"
        android:orientation="horizontal"
        app:layout_constraintEnd_toEndOf="parent"
        app:layout_constraintStart_toStartOf="parent"
        app:layout_constraintTop_toBottomOf="@+id/linearLayout4">

        <TextView
            android:id="@+id/tvNotifica"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:layout_weight="1"
            android:text="tvNotifica" />

        <TextView
            android:id="@+id/tvNotificaHora"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:layout_weight="1"
            android:text="tvNotificaHora" />
    </LinearLayout>

    <EditText
        android:id="@+id/txtUrl"
        android:layout_width="0dp"
        android:layout_height="wrap_content"
        android:ems="10"
        android:hint="Url"
        android:inputType="text"
        android:text="https://pastebin.com/raw/wSygXS1K"
        android:textSize="16sp"
        app:layout_constraintEnd_toEndOf="parent"
        app:layout_constraintStart_toStartOf="parent"
        app:layout_constraintTop_toTopOf="parent" />

</androidx.constraintlayout.widget.ConstraintLayout>

Descarga el codigo: programadornovato/sms_masivos (github.com)

Los comentarios están cerrados.