OK。アプリを介してテキストメッセージを送信しています。テキストメッセージが送信された後、サーバーにステータスの更新を送信します。この部分は大丈夫ですが、私が直面している問題は2つあります。それらが関連しているかどうかはわかりませんが、関連していると思います。
私のアプリには、単一のテキストを複数のユーザーに送信する機能があります。コードのサンプルは次のとおりです...
if(phoneNumbers.length > 0 && message.getText().toString().equals("") == false)
{
for(int i=0;i<phoneNumbers.length;i++)
{
sms = SmsManager.getDefault();
try
{
sms.sendTextMessage(phoneNumbers[i], null, message.getText().toString(), null, null);
sentQuantity++;
}
catch(IllegalArgumentException e)
{
}
}
}
基本的に、電話番号の配列をループし、テキストを一度に1つずつ送信します。ここに私の問題の一部があります。テキストの送信先として3つ以上の数字を選択した場合、すべてのテキストが実際に送信されないことがあります。非常にランダムに発生します。
個々のメッセージを送信する間に遅延があるが、コードは十分に長く待機しないためだと思います。 Eclipseを使用してプログラムに足を踏み入れ、手動でアプリを操作すると、すべてが常に正常に機能するため、この仮定に達しました。
もう1つの問題は、テキストメッセージステータスの更新をWebサーバーに送信するときです。
テキストメッセージが送信されるとすぐに、アプリはインターネットに接続し、送信されたテキストの数をHTTPポスト経由でサーバーに通知します。ここに私のインターネットコードのスニペットがあります...
for(int i = 0; i < postNames.length; i++)
{
nameValuePairs.add(new BasicNameValuePair(postNames[i], postValues[i]));
}
//http post
try{
HttpParams httpParameters = new BasicHttpParams();
int timeoutConnection = 10000;
HttpConnectionParams.setConnectionTimeout(httpParameters,timeoutConnection );
HttpClient httpclient = new DefaultHttpClient(httpParameters);
HttpPost httppost = new HttpPost(webAddress);
httppost.setEntity(new UrlEncodedFormEntity(nameValuePairs));
HttpResponse response = httpclient.execute(httppost);
HttpEntity entity = response.getEntity();
is = entity.getContent();
このセクションでは、投稿のアイテムをコンパイルし、Webページに接続して、投稿を送信します。ここで重要なのは、10秒の接続タイムアウトです。繰り返しますが、先ほど言ったように、インターネット接続はテキストを送信した直後に発生します。そのため、デバッグモードに移行して、手動でプロセスを実行すると、すべてが正常に機能します。ただし、スマートフォンでアプリを実行するだけの場合、接続タイムアウトエラーが発生します。
ここで、受信者の数に関係なく、テキストメッセージの数を1つのテキストに減らすことができれば、それは素晴らしいことです。電話番号をコンマで区切ろうとしましたが、うまくいきませんでした。また、数値をセミコロンで区切ってみました(Microsoft OutlookやGMailで複数の受信者をメールに追加する方法とまったく同じです)。それらのどれも私のために働いた。誰か提案はありますか?まったく別のアプローチがあったとしても、それは高く評価されるでしょう。ああ、メッセージを送信するためにGoogleメッセージングインテントを使用したくないので、自分のアプリを使用する必要があります。
実際には、前のSMSが送信された後に次のSMSを送信する必要があります。このため、送信されたSMSのステータスを確認する必要があります。 このチュートリアルを参照
SMSメッセージ送信プロセスのステータスを監視する必要がある場合、実際には、このように2つのPendingIntentオブジェクトと2つのBroadcastReceiverオブジェクトを使用できます:
//---sends an SMS message to another device---
private void sendSMS(String phoneNumber, String message)
{
String SENT = "SMS_SENT";
String DELIVERED = "SMS_DELIVERED";
PendingIntent sentPI = PendingIntent.getBroadcast(this, 0,
new Intent(SENT), 0);
PendingIntent deliveredPI = PendingIntent.getBroadcast(this, 0,
new Intent(DELIVERED), 0);
//---when the SMS has been sent---
registerReceiver(new BroadcastReceiver(){
@Override
public void onReceive(Context arg0, Intent arg1) {
switch (getResultCode())
{
case Activity.RESULT_OK:
Toast.makeText(getBaseContext(), "SMS sent",
Toast.LENGTH_SHORT).show();
break;
case SmsManager.RESULT_ERROR_GENERIC_FAILURE:
Toast.makeText(getBaseContext(), "Generic failure",
Toast.LENGTH_SHORT).show();
break;
case SmsManager.RESULT_ERROR_NO_SERVICE:
Toast.makeText(getBaseContext(), "No service",
Toast.LENGTH_SHORT).show();
break;
case SmsManager.RESULT_ERROR_NULL_PDU:
Toast.makeText(getBaseContext(), "Null PDU",
Toast.LENGTH_SHORT).show();
break;
case SmsManager.RESULT_ERROR_RADIO_OFF:
Toast.makeText(getBaseContext(), "Radio off",
Toast.LENGTH_SHORT).show();
break;
}
}
}, new IntentFilter(SENT));
//---when the SMS has been delivered---
registerReceiver(new BroadcastReceiver(){
@Override
public void onReceive(Context arg0, Intent arg1) {
switch (getResultCode())
{
case Activity.RESULT_OK:
Toast.makeText(getBaseContext(), "SMS delivered",
Toast.LENGTH_SHORT).show();
break;
case Activity.RESULT_CANCELED:
Toast.makeText(getBaseContext(), "SMS not delivered",
Toast.LENGTH_SHORT).show();
break;
}
}
}, new IntentFilter(DELIVERED));
SmsManager sms = SmsManager.getDefault();
sms.sendTextMessage(phoneNumber, null, message, sentPI, deliveredPI);
}
これが必要だと思います。以下のスニペットは、長いメッセージを入力し、それらを部分に分割し、それぞれを特定の連絡先または連絡先のグループに個別に送信することを提供します
public void sendLongSMS() {
String phoneNumber = "0123456789";
String message = "Hello World! Now we are going to demonstrate " +
"how to send a message with more than 160 characters from your Android application.";
SmsManager smsManager = SmsManager.getDefault();
ArrayList<String> parts = smsManager.divideMessage(message);
smsManager.sendMultipartTextMessage(phoneNumber, null, parts, null, null);
}
まず、AndroidManifest.xmlファイルに権限を追加する必要があります
<uses-permission Android:name="Android.permission.SEND_SMS"></uses-permission>
次に、このコードを書きます
try {
String ph="1234568790";
String msg="Haiii friend";
SmsManager smsManager = SmsManager.getDefault();
smsManager.sendTextMessage(ph, null,msg, null, null);
Toast.makeText(MainActivity.this, "Message Sent",
Toast.LENGTH_LONG).show();
}
catch (Exception e)
{
Toast.makeText(MainActivity.this, "Message not Sent",
Toast.LENGTH_LONG).show();
}