Android KitKat 4.4 Hangouts no puede manejar la intención de envío de SMS

Código para enviar sms que funcionó perfectamente hasta Android 4.3 (Jelly Bean) dejó de funcionar desde 4.4 (KitKat)

Sólo estoy preparando el mensaje de texto para el usuario, pero él tiene que elegir el número para enviar a

El código que he usado es:

Intent sendIntent = new Intent(Intent.ACTION_VIEW); sendIntent.setData(Uri.parse("sms:")); sendIntent.putExtra("sms_body", smsText); activity.startActivity(sendIntent); 

Puesto que paró el trabajar intenté también ACTION_SEND y ACTION_SENDTO Ambos no trabajaron, también intenté el sendIntent.setType("vnd.android-dir/mms-sms"); , De nuevo nada funcionó.

Busqué varias respuestas en stackoverflow respuesta 1 y respuesta 2 , pero ambas respuestas no están tratando con los requisitos que tengo.

Lo que me gustaría hacer:

  • Enviar sms con la aplicación sms solamente, no por todas las aplicaciones que sirven la intención de envío
  • Preparar el texto para el usuario
  • Deje que el usuario elija el número de teléfono para enviar el mensaje a

Para los moderadores: No se trata de un duplicado de preguntas, ya que las preguntas, no hacen exactamente lo mismo, la necesidad aquí es enviar sms sin número de teléfono, y ninguna de las preguntas y respuestas tratadas con eso.

Adjunto un código que soluciona el problema haciendo lo siguiente:

  • Compruebe la versión del sistema operativo
  • En caso de que la versión anterior (antes de KitKat), utilice el método antiguo
  • Si es una API nueva, compruebe el paquete sms predeterminado. Si lo hay, establecelo como el paquete, de lo contrario, deje que el usuario elija la aplicación de uso compartido.

Aquí está el código:

 if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT) //At least KitKat { String defaultSmsPackageName = Telephony.Sms.getDefaultSmsPackage(activity); //Need to change the build to API 19 Intent sendIntent = new Intent(Intent.ACTION_SEND); sendIntent.setType("text/plain"); sendIntent.putExtra(Intent.EXTRA_TEXT, smsText); if (defaultSmsPackageName != null)//Can be null in case that there is no default, then the user would be able to choose any app that support this intent. { sendIntent.setPackage(defaultSmsPackageName); } activity.startActivity(sendIntent); } else //For early versions, do what worked for you before. { Intent sendIntent = new Intent(Intent.ACTION_VIEW); sendIntent.setData(Uri.parse("sms:")); sendIntent.putExtra("sms_body", smsText); activity.startActivity(sendIntent); } 

Combinando las soluciones propuestas, lo siguiente proporciona preestablecer el destinatario y el texto.

 Intent intent; if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT) // Android 4.4 and up { String defaultSmsPackageName = Telephony.Sms.getDefaultSmsPackage(activity); intent = new Intent(Intent.ACTION_SENDTO, Uri.parse("smsto:" + Uri.encode(toContact.toString()))); intent.putExtra("sms_body", text); if (defaultSmsPackageName != null) // Can be null in case that there is no default, then the user would be able to choose any app that supports this intent. { intent.setPackage(defaultSmsPackageName); } } else { intent = new Intent(Intent.ACTION_VIEW); intent.setType("vnd.android-dir/mms-sms"); intent.putExtra("address", toContact.toString()); intent.putExtra("sms_body", text); } activity.startActivity(intent); 

El único problema que queda es que terminas en Hangouts (Nexus 5), y es posible que tengas que pulsar "atrás" varias veces para cancelar el SMS.

Éste debe funcionar en todas las versiones android y todas las aplicaciones sms (incluyendo Hangouts).

 public static boolean sendSms(Context context, String text, String number) { return sendSms(context, text, Collections.singletonList(number)); } public static boolean sendSms(Context context, String text, List<String> numbers) { String numbersStr = TextUtils.join(",", numbers); Uri uri = Uri.parse("sms:" + numbersStr); Intent intent = new Intent(); intent.setData(uri); intent.putExtra(Intent.EXTRA_TEXT, text); intent.putExtra("sms_body", text); intent.putExtra("address", numbersStr); if(Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT) { intent.setAction(Intent.ACTION_SENDTO); String defaultSmsPackageName = Telephony.Sms.getDefaultSmsPackage(context); if(defaultSmsPackageName != null) { intent.setPackage(defaultSmsPackageName); } } else { intent.setAction(Intent.ACTION_VIEW); intent.setType("vnd.android-dir/mms-sms"); } try { context.startActivity(intent); } catch (ActivityNotFoundException e) { e.printStackTrace(); return false; } return true; } 
FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.