Android KitKat 4.4 Hangouts не может обрабатывать намерение отправки SMS
Код для отправки sms, который отлично работал до Android 4.3 (Jelly Bean), перестает работать с версии 4.4 (KitKat)
Я просто готовлю текстовое сообщение для пользователя, но ему нужно выбрать номер для отправки на
Используемый мной код:
Intent sendIntent = new Intent(Intent.ACTION_VIEW);
sendIntent.setData(Uri.parse("sms:"));
sendIntent.putExtra("sms_body", smsText);
activity.startActivity(sendIntent);
Так как он прекратил работу, я попробовал также ACTION_SEND
и ACTION_SENDTO
Оба не работали, я также попробовал sendIntent.setType("vnd.android-dir/mms-sms");
, снова ничего не получилось.
Я искал несколько ответов в stackoverflow ответ 1 и ответ 2, но оба ответа не являются имея дело с требованиями, которые у меня есть.
Что я хотел бы сделать:
- Отправьте sms только с помощью приложения sms, а не всеми приложениями, которые выполняют намерение отправки.
- Подготовьте текст для пользователя
- Позвольте пользователю выбрать номер телефона для отправки сообщения
Для модераторов:
Это не повторяющиеся вопросы, так как вопросы не задают точно то же самое, необходимо послать sms без номера телефона, и ни один из вопросов и ответов не касался этого.
Ответы
Ответ 1
Я прикрепил код, который решает проблему, выполнив следующие действия:
- Проверьте версию ОС
- В случае старой версии (до KitKat) используйте старый метод
- Если новый API, проверьте пакет sms по умолчанию. если он есть, установите его как пакет, в противном случае разрешите пользователю выбрать приложение для совместного использования.
Вот код:
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);
}
Ответ 2
Объединяя предлагаемые решения, ниже приводится предварительный настрой для текста получателя и.
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);
Остается только проблема: вы попали в Hangouts (Nexus 5), и вам может потребоваться несколько раз нажать "назад", чтобы эффективно отменить SMS.
Ответ 3
Этот должен работать на всех версиях Android и всех sms-приложениях (включая 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;
}