web-dev-qa-db-ja.com

androidでプログラムでテキストメッセージを送信する

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メッセージングインテントを使用したくないので、自分のアプリを使用する必要があります。

40
Lucas Bailey

実際には、前の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);        
    }
71
Yaqub Ahmad

これが必要だと思います。以下のスニペットは、長いメッセージを入力し、それらを部分に分割し、それぞれを特定の連絡先または連絡先のグループに個別に送信することを提供します

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);
}
18

まず、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();
            }
2
Antony jackson