2016-08-22 2 views
3

Я отправляю 5 сообщений через android SmsManager и вам необходимо проверить заказ доставки. Являются ли SMS-сообщениями, отправленными в порядке доставки в том же порядке или нет. Если нет, каков порядок доставки?Проверить заказ SMS в Android

Я думаю, что смогу это сделать BroadcastReceiver, чтобы проверить доставку, но как насчет порядка?

Благодаря

+0

«являются SMSs, которые отправляются в порядке доставлены в том же порядке, или нет» - я бы не стал рассчитывать на то, если вы отправляете второй, прежде чем вы узнаете, что первый получил вед. «Если нет, каков порядок доставки?» - независимо от того, что хочет мобильный оператор. – CommonsWare

+0

@CommonsWare спасибо, я просто хочу узнать заказ. Не хотите контролировать заказ. –

+0

Не могу я добавить что-то вроде ID к SMS, чтобы проверить его в доставке «BroadcastReceiver»? –

ответ

-2

В файле main.xml находится в папке Рез/макета, добавьте следующий код, так что пользователь может ввести номер телефона, а также сообщения для отправки:

<?xml version="1.0" encoding="utf-8"?> 
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" 
    android:orientation="vertical" 
    android:layout_width="fill_parent" 
    android:layout_height="fill_parent" 
    > 
    <TextView 
     android:layout_width="fill_parent" 
     android:layout_height="wrap_content" 
     android:text="Enter the phone number of recipient" 
     />  
    <EditText 
     android:id="@+id/txtPhoneNo" 
     android:layout_width="fill_parent" 
     android:layout_height="wrap_content"   
     /> 
    <TextView 
     android:layout_width="fill_parent" 
     android:layout_height="wrap_content"   
     android:text="Message" 
     />  
    <EditText 
     android:id="@+id/txtMessage" 
     android:layout_width="fill_parent" 
     android:layout_height="150px" 
     android:gravity="top"   
     />   
    <Button 
     android:id="@+id/btnSendSMS" 
     android:layout_width="fill_parent" 
     android:layout_height="wrap_content" 
     android:text="Send SMS" 
     />  
</LinearLayout> 

Далее, в действии SMS, мы подключаем представление Button так, чтобы, когда пользователь нажимает на него, мы проверим, чтобы указать номер телефона получателя и сообщение, прежде чем мы отправим сообщение с помощью sendSMS() функцию, которую мы определим в ближайшее время:

import android.app.Activity; 
import android.app.PendingIntent; 
import android.content.Intent; 
import android.os.Bundle; 
import android.telephony.gsm.SmsManager; 
import android.view.View; 
import android.widget.Button; 
import android.widget.EditText; 
import android.widget.Toast; 


    public class SMS extends Activity 
    { 
     Button btnSendSMS; 
     EditText txtPhoneNo; 
     EditText txtMessage; 

     /** Called when the activity is first created. */ 
     @Override 
     public void onCreate(Bundle savedInstanceState) 
     { 
      super.onCreate(savedInstanceState); 
      setContentView(R.layout.main);   

      btnSendSMS = (Button) findViewById(R.id.btnSendSMS); 
      txtPhoneNo = (EditText) findViewById(R.id.txtPhoneNo); 
      txtMessage = (EditText) findViewById(R.id.txtMessage); 

      btnSendSMS.setOnClickListener(new View.OnClickListener() 
      { 
       public void onClick(View v) 
       {     
        String phoneNo = txtPhoneNo.getText().toString(); 
        String message = txtMessage.getText().toString();     
        if (phoneNo.length()>0 && message.length()>0)     
         sendSMS(phoneNo, message);     
        else 
         Toast.makeText(getBaseContext(), 
          "Please enter both phone number and message.", 
          Toast.LENGTH_SHORT).show(); 
       } 
      });   
     }  
    } 

The SendSMS() функция определяется следующим образом:

public class SMS extends Activity 
{ 
    //... 

    /** Called when the activity is first created. */ 
    @Override 
    public void onCreate(Bundle savedInstanceState) 
    { 
     //... 
    } 

    //---sends an SMS message to another device--- 
    private void sendSMS(String phoneNumber, String message) 
    {   
     PendingIntent pi = PendingIntent.getActivity(this, 0, 
      new Intent(this, SMS.class), 0);     
     SmsManager sms = SmsManager.getDefault(); 
     sms.sendTextMessage(phoneNumber, null, message, pi, null);   
    }  
} 

Чтобы отправить сообщение SMS, вы используете класс SMSManager. В отличие от других классов, вы не напрямую создаете экземпляр этого класса; вместо этого вы вызовете статический метод getDefault(), чтобы получить объект SmsManager. Метод sendTextMessage() отправляет SMS-сообщение с помощью PendingIntent. Объект PendingIntent используется для идентификации цели для последующего вызова. Например, после отправки сообщения вы можете использовать объект PendingIntent для отображения другого действия. В этом случае объект PendingIntent (pi) просто указывает на ту же активность (SMS.java), поэтому при отправке SMS ничего не произойдет.

Если вам необходимо следить за состоянием сообщения 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);   
    } 

Помимо программной отправки SMS-сообщений, вы также можете перехватывать входящие SMS-сообщения с использованием объекта BroadcastReceiver.

Чтобы узнать, как получить SMS-сообщения из вашего Android-приложения в файле AndroidManifest.xml добавить элемент так, чтобы входящие SMS-сообщения могут быть перехвачены классом SmsReceiver:

<?xml version="1.0" encoding="utf-8"?> 
<manifest xmlns:android="http://schemas.android.com/apk/res/android" 
     package="net.learn2develop.SMSMessaging" 
     android:versionCode="1" 
     android:versionName="1.0.0"> 
    <application android:icon="@drawable/icon" android:label="@string/app_name"> 
     <activity android:name=".SMS" 
        android:label="@string/app_name"> 
      <intent-filter> 
       <action android:name="android.intent.action.MAIN" /> 
       <category android:name="android.intent.category.LAUNCHER" /> 
      </intent-filter> 
     </activity>   

     <receiver android:name=".SmsReceiver"> 
      <intent-filter> 
       <action android:name= 
        "android.provider.Telephony.SMS_RECEIVED" /> 
      </intent-filter> 
     </receiver> 

    </application> 
    <uses-permission android:name="android.permission.SEND_SMS"> 
    </uses-permission> 
    <uses-permission android:name="android.permission.RECEIVE_SMS"> 
    </uses-permission> 
</manifest> 

В классе SmsReceiver , расширить класс BroadcastReceiver и переопределить метод OnReceive():

import android.content.BroadcastReceiver; 
import android.content.Context; 
import android.content.Intent; 
import android.os.Bundle; 
import android.telephony.gsm.SmsMessage; 
import android.widget.Toast; 

public class SmsReceiver extends BroadcastReceiver 
{ 
    @Override 
    public void onReceive(Context context, Intent intent) 
    { 
     //---get the SMS message passed in--- 
     Bundle bundle = intent.getExtras();   
     SmsMessage[] msgs = null; 
     String str = "";    
     if (bundle != null) 
     { 
      //---retrieve the SMS message received--- 
      Object[] pdus = (Object[]) bundle.get("pdus"); 
      msgs = new SmsMessage[pdus.length];    
      for (int i=0; i<msgs.length; i++){ 
       msgs[i] = SmsMessage.createFromPdu((byte[])pdus[i]);     
       str += "SMS from " + msgs[i].getOriginatingAddress();      
       str += " :"; 
       str += msgs[i].getMessageBody().toString(); 
       str += "n";   
      } 
      //---display the new SMS message--- 
      Toast.makeText(context, str, Toast.LENGTH_SHORT).show(); 
     }       
    } 
} 
+0

Спасибо, но я знаю концепцию отправки и приема SMS, мне нужно уникальное решение. Пожалуйста, прочитайте мой вопрос еще раз. –

+0

Я даю радиовещательный приемник для проверки смс отправить или нет –

+0

и вы также можете найти sms-запрос, который считается приемником радиопередачи, пожалуйста, внимательно прочитайте –

Смежные вопросы