Android 4.3(Jelly bean)4.4(KitKat)以降動作を停止するまで完全に機能したSMSを送信するためのコード
ユーザー用のテキストメッセージを準備していますが、送信する番号を選択する必要があります
私が使用したコードは次のとおりです。
_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 answer 1 および answer 2 でいくつかの答えを探しましたが、両方の答えが私が持っている要件を処理していません。
私がやりたいこと:
モデレーターの場合:質問はまったく同じことを尋ねないため、重複した質問ではありません。ここで必要なのは、電話番号のない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);
}
これは、すべてのAndroidバージョンとすべてのSMSアプリ(ハングアウトを含む)で動作するはずです。
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;
}
提案されたソリューションを組み合わせて、以下は受信者の事前設定を提供しますおよびテキスト。
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);
残る唯一の問題は、ハングアウト(Nexus 5)になってしまうことです。SMSを効果的にキャンセルするには、「戻る」を複数回押す必要があります。