在安卓系统中编程发送短信

42

好的。我正在通过我的应用程序发送短信。发送完短信后,它会将状态更新发送到服务器。这部分功能运行良好,但我遇到的问题有两个。我不确定它们是否相关,但我认为它们是相关的。

我的应用程序可以向多个用户发送单个文本。下面是一些示例代码...

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)
        {

        }
    }
}

基本上,它只是循环遍历电话号码数组,并逐个发送文本。这就是我的一个问题所在。如果我选择发送短信给三个或更多的号码,有时并不是所有的短信都能被发送出去。这种情况非常随机。

我认为这是因为在发送每条单独的消息之间存在延迟,但代码没有等待足够长的时间。我得出了这个假设,因为如果我使用eclipse步进程序并手动浏览应用程序,一切都能正常工作。

我的另一个问题是当我向web服务器发送短信状态更新时。

在短信发送后立即,该应用程序会连接到互联网,并通过http post告诉服务器已发送的短信数量。以下是我的互联网代码片段...

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();

这一部分仅是将帖子的内容进行编译,连接到网页并发送该帖子。关键在于10秒的连接超时时间。就像我之前说的那样,发送文本后,互联网连接会立即发生。所以,如果我进入调试模式并手动逐步执行该过程,一切都很顺利。但是,如果我只在手机上运行应用程序,就会出现连接超时错误。

现在,我希望如果我可以将短信数量减少到一个单一的短信,而不管收件人数量是多少,那将是很棒的。我尝试使用逗号将电话号码分开,但那行不通。我还尝试使用分号来分隔数字(与Microsoft Outlook或Gmail让您向电子邮件添加多个收件人的方式完全相同)。但这些对我都没有起作用。有人有任何建议吗?即使有完全不同的方法也没问题。哦,我不想使用Google消息意图来发送短信,我需要使用自己的应用程序。


顺便提一下,在电话中,逗号表示暂停,而不是分隔符。例如,如果您拨打一个号码并需要在键入分机号码之前等待一段时间,可以编写2135551212,,,,123。这将呼叫该号码,等待5个暂停,然后进一步拨打123。 - Alexis Wilke
4个回答

74

实际上,您需要在发送前一个短信之后发送下一个短信。为此,您需要检查所发送的短信的状态,请参考此教程,其中提到:

如果您需要监视SMS消息发送过程的状态,则可以使用两个PendingIntent对象和两个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);        
    }

1
这并没有回答我的问题。简短的问题是,“我如何将多个文本消息合并为一个带有多个收件人的单个文本消息?” - Lucas Bailey
1
你实际上需要在前一条短信发送之前发送下一条短信。 - Yaqub Ahmad
5
谢谢您的回答,不过我也发现当我们完成广播操作时,在 OnReceive() 回调中调用 unregisterReceiver(this); 是必要的,否则会导致意图接收器泄漏。 - JWL
1
为什么这个答案被接受了?“你实际上需要在前一个短信发送之前发送下一个短信”没有意义,你怎么能在第一个短信发送之前发送第二个短信呢...人们是因为它提供了一些有用的代码而投票吗,即使它没有回答问题?还是我错过了什么?如果是这样,请原谅我... - Pin
1
如果我理解正确的话,这个回答的意思是你实际上不能将一条短信发送给多个收件人。是这样吗? - Michael
显示剩余8条评论

19

我猜这就是你需要的。下面的代码片段可以让你输入长消息并将其分成一部分,然后将每个部分单独发送给指定的联系人,甚至是一组联系人。

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

2
这并没有回答问题,问题是如何将同一条消息发送到多个号码,而不是将多个部分的消息发送到单个号码。 - Jules
谢谢兄弟,你救了我的一天。 - Nikunj Paradva

2

首先,您必须在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();
            }

1
这并没有回答问题,问题是如何将消息发送到多个号码,而不仅仅是像这段代码一样发送到一个号码(这段代码与原始问题中的代码基本相同)。 - Jules

-1
你可以尝试这个:

SmsManager.getDefault().sendTextMessage(phoneNUmber, null, messageToSend, null, null);

谢谢。

这并没有回答问题,问题是如何将消息发送给多个号码,而不仅仅是像这段代码(与原始问题中的代码基本相同)只发给一个号码。 - Jules

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接