以编程方式发送SMS Android(未接收状态)

时间:2012-10-03 02:48:47

标签: android android-intent sms broadcastreceiver

我正在逐字逐句地使用http://mobiforge.com/developing/story/sms-messaging-android代码示例,除了我改变的事实:

import android.telephony.gsm.SmsManager;

为:

import android.telephony.SmsManager;

SMS正在发送正常但是我没有收到它已发送(发送到网络)的TOAST消息。我正在尝试将SMS集成到我的应用程序中,这很重要。我确信这可以做到,因为股票短信应用程序还知道何时停止显示“发送圈”。相关代码部分如下:

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

我正在使用Jelly Bean ROM,但我相信我前一段时间在Gingerbread和ICS上测试了这个相同的片段,结果相同。 API是否已更改或样本存在问题?如果有帮助,我正在测试Sasmsung GSIII。我的旧测试是在史诗上。

2 个答案:

答案 0 :(得分:1)

对于现在遇到此问题的任何人,如果您在Android 4.4或更高版本上进行测试,除非您的应用是默认的短信应用,否则它将无效。

来自文档 -

  
    

从Android 4.4开始,系统设置允许用户选择“默认短信应用”。一旦选中,只有默认的SMS应用程序能够写入SMS提供程序,并且当用户收到SMS或当用户收到MMS时,只有默认SMS应用程序接收SMS_DELIVER_ACTION广播时才会收到SMS或WAP_PUSH_DELIVER_ACTION广播。默认的SMS应用程序负责在收到或发送新消息时向SMS提供商写入详细信息。

  

请参阅here

答案 1 :(得分:0)

你的代码看起来很不错。也许问题是您的运营商没有向您提供发送报告(可能有订购服务的选项),或者您没有在您的手机中打开发送报告。在Play商店中有一个名为Delivery Reports的有用应用程序,您可以从中查看每个短信的状态。