Code d'envoi de sms qui fonctionnait parfaitement jusqu'à Android 4.3 (Jelly bean) et a cessé de fonctionner depuis 4.4 (KitKat)
Je prépare simplement le message texte pour l'utilisateur, mais il doit choisir le numéro auquel envoyer.
Le code que j'ai utilisé est:
Intent sendIntent = new Intent(Intent.ACTION_VIEW);
sendIntent.setData(Uri.parse("sms:"));
sendIntent.putExtra("sms_body", smsText);
activity.startActivity(sendIntent);
Depuis qu'il a cessé de fonctionner, j'ai également essayé les ACTION_SEND
Et ACTION_SENDTO
Aucun n'a fonctionné, j'ai également essayé la sendIntent.setType("vnd.Android-dir/mms-sms");
, mais encore une fois rien n'a fonctionné.
J'ai regardé plusieurs réponses sur Stack Overflow réponse 1 et réponse 2 , mais les deux réponses ne traitent pas des exigences que j'ai.
Ce que j'aimerais faire:
Pour les modérateurs: Ce ne sont pas des questions en double, car les questions ne demandent pas exactement la même chose, la nécessité ici est d'envoyer des sms sans numéro de téléphone, et aucune des questions et réponses n'a traité de cela.
J'ai joint un code qui résout le problème en procédant comme suit:
Voici le code:
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);
}
Celui-ci devrait fonctionner sur toutes les versions Android Android et toutes les applications sms (y compris 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;
}
En combinant les solutions proposées, ce qui suit fournit le préréglage du destinataire et le texte.
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);
Le seul problème qui reste est que vous vous retrouvez dans Hangouts (Nexus 5), et vous devrez peut-être appuyer plusieurs fois sur "Retour" pour annuler efficacement le SMS.