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)