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






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


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)