2011-11-14 12 views
0

こんにちは私は同じ問題に直面しました。私は1つの放送受信機を持っているので、私は受信箱からメッセージを得るためのサービスを始めました。その後、私はそれらのメッセージを特定の番号に送信します。送信メッセージについては、上記と同じコードを使用しました(Johnによって投稿されました)。私の問題は、メッセージを送信するときに、トーストのメッセージ「SMS SENT」が継続的に来ることです。どうすればそれを一度だけ受け取ることができますか?アンドロイドで一度だけブロードキャストレシーバを呼び出すには?

私はこれに固執しています。誰かが私が間違っている場所を教えてください。

ありがとうございました。

ここに私は私のコードを掲載: -

package z.z.z; 

import android.content.BroadcastReceiver; 
import android.content.Context; 
import android.content.Intent; 
import android.os.Bundle; 
import android.telephony.SmsMessage; 
import android.util.Log; 

public class SMSReceiver extends BroadcastReceiver 
{ 
    private SmsMessage[] msgs; 
    private String strNo,strMsgText; 

    @Override 
    public void onReceive(Context context, Intent intent) 
    { 
     try 
     { 
      Bundle bundle = intent.getExtras();   
      msgs = null; 
      String str = "";   

      if (bundle != null) 
      { 
       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"; 
        strNo = msgs[i].getOriginatingAddress();  
        strMsgText = msgs[i].getDisplayMessageBody(); 

       } 

       context.startService(new Intent(context,IncomingSMSService.class)); 

      } 
     } 
     catch (Exception e) 
     { 
      e.printStackTrace(); 
     } 
    } 

} 

IncomingSMSService: -

package z.z.z; 

import java.util.ArrayList; 

import z.z.z.Global; 
import z.z.z.SMSService; 

import android.app.Service; 
import android.content.Intent; 
import android.database.Cursor; 
import android.net.Uri; 
import android.os.IBinder; 
import android.util.Log; 

public class IncomingSMSService extends Service 
{ 

    private String TAG = "IncomingSMSService"; 

    @Override 
    public IBinder onBind(Intent intent) 
    { 
     return null; 
    } 

    @Override 
    public void onCreate() 
    { 
     /* start service */ 

     Log.d(TAG ,"****** in service onCreate **----- "); 
     super.onCreate(); 

     try 
     { 
      Log.d(TAG ,"****** in service try **----- "); 
      /* Read SMS from INBOX */ 
      Uri uriSMSURI = Uri.parse("content://sms/inbox");  
      Cursor cur = getContentResolver().query(uriSMSURI, null, null, null,null);  
      String sms = "";  
      while (cur.moveToNext()) 
      {   
        sms += "From :" + cur.getString(2) + " : " + cur.getString(11)+"\n"; 
    //    Log.d(TAG, "in SMS Service sms in loop :: "+ sms); 
      } 
      Log.d(TAG, "in SMS Service sms :: "+ sms); 


      Log.d(TAG ,"********** reverseNum ****** "+ Global.destNo); 
      ArrayList<String> ayyMsg = new ArrayList<String>(); 
      ayyMsg.add(sms); 
      SMSService.sendSMS(getBaseContext(), ayyMsg, Global.destNo); 
     } 
     catch (Exception e) 
     { 
      e.printStackTrace(); 
     } 
    }} 

SendSMS

package z.z.z; 

    import java.util.ArrayList; 

    import z.z.z.common.RMAReceiver; 

    import android.app.PendingIntent; 
    import android.content.Context; 
    import android.content.Intent; 
    import android.content.IntentFilter; 
    import android.telephony.SmsManager; 
    import android.util.Log; 

    public class SMSService 
    { 

     static String TAG = "SMSService"; 
     static String SENT = "SMS_SENT"; 
     static String DELIVERED = "SMS_DELIVERED"; 

    // static Context mContext; 
     static RMAReceiver rmaReceiver = null; 
     public static void sendSMS(Context context,ArrayList<String> message, String destNumber) 
     { 
      try 
      { 



       PendingIntent sentPI = PendingIntent.getBroadcast(context, 0,new Intent(SENT), 0); 

       PendingIntent deliveredPI = PendingIntent.getBroadcast(context, 0,new Intent(DELIVERED), PendingIntent.FLAG_CANCEL_CURRENT); 

       ArrayList<PendingIntent> ayySentPI = new ArrayList<PendingIntent>(); 
       ayySentPI.add(sentPI); 

       ArrayList<PendingIntent> ayyDeliveredPI = new ArrayList<PendingIntent>(); 
       ayyDeliveredPI.add(deliveredPI); 

       receiver(context); 

       SmsManager sms = SmsManager.getDefault(); 

       sms.sendMultipartTextMessage(destNumber, null, message, ayySentPI, ayyDeliveredPI); 

      } 
      catch (Exception e) 
      { 
       e.printStackTrace(); 
      } 
     } 

**receiver**:- 

    public static void receiver(Context context) 
     { 
      rmaReceiver = RMAReceiver.getSingleInstance(); 
      context.registerReceiver(rmaReceiver, new IntentFilter(SENT)); 

      //---when the SMS has been delivered--- 
      context.registerReceiver(rmaReceiver, new IntentFilter(DELIVERED)); 
     } 

RMAReceiver

package z.z.z; 

import z.z.z.SMSService; 

import android.app.Activity; 
import android.content.BroadcastReceiver; 
import android.content.Context; 
import android.content.Intent; 
import android.telephony.SmsManager; 
import android.widget.Toast; 

public class RMAReceiver extends BroadcastReceiver 
{ 
    private static RMAReceiver singleInstance = null; 
    String msg; 

    private RMAReceiver() 
    {  
    } 

    public static RMAReceiver getSingleInstance() 
    { 
     if(singleInstance == null) singleInstance = new RMAReceiver(); 
     return singleInstance; 
    } 

    @Override 
    public void onReceive(Context context, Intent intent) 
    { 
     System.out.println("Result Code: "+getResultCode()); 
//  resultCode = getResultCode(); 
     switch (getResultCode()) 
     { 
      case Activity.RESULT_OK: 
       msg = "SMS sent/delivered"; 
//    Toast.makeText(context, "SMS sent/delivered", 
//      Toast.LENGTH_SHORT).show(); 
//    SMSService.sendSMS(context, "SMS sent/delivered", Global.confirmNo); 
       break; 
      case SmsManager.RESULT_ERROR_GENERIC_FAILURE: 
       msg = "Generic failure"; 
//    Toast.makeText(context, "Generic failure", 
//      Toast.LENGTH_SHORT).show(); 
//    SMSService.sendSMS(context, "Generic failure", Global.confirmNo); 
       break; 
      case SmsManager.RESULT_ERROR_NO_SERVICE: 
       msg = "No service"; 
//    Toast.makeText(context, "No service", 
//      Toast.LENGTH_SHORT).show(); 
//    SMSService.sendSMS(context, "No service", Global.confirmNo); 
       break; 
      case SmsManager.RESULT_ERROR_NULL_PDU: 
       msg = "Null PDU"; 
//    Toast.makeText(context, "Null PDU", 
//      Toast.LENGTH_SHORT).show(); 
//    SMSService.sendSMS(context, "No service", Global.confirmNo); 
       break; 
      case SmsManager.RESULT_ERROR_RADIO_OFF: 
       msg = "Radio off"; 
//    Toast.makeText(context, "Radio off", 
//      Toast.LENGTH_SHORT).show(); 
//    SMSService.sendSMS(context, "No service", Global.confirmNo); 
       break; 
      case Activity.RESULT_CANCELED: 
       msg = "SMS not delivered"; 
//    Toast.makeText(context, "SMS not delivered", 
//      Toast.LENGTH_SHORT).show(); 
//    SMSService.sendSMS(context, "No service", Global.confirmNo); 
       break; 
     } 

     Toast.makeText(context, msg, Toast.LENGTH_SHORT).show(); 
     SMSService.sendSMS(context, msg, Global.confirmNo); 



    } 


} 

答えて

0

そういう風に設定したように見えます。 IncomingSMSServiceは、あなたのSMSReceiverが登録されているSMSService.sendSMS関数を呼び出して、あなたのIncomingSMSServiceを何度も起動させるという意図を送信します。

このチェーンの1つのリンクを削除し、繰り返し問題が解決されているかどうかを確認してください。

+0

実際には、通知として特定の番号に「SMS SEND」というメッセージを送信する必要があります。それで私はRMAReceiverから再びSMSを送信します。 – anddev

+1

問題は、あなたのカスタムクラス 'SMSService.sendSMS'を使用して、送信通知と配信通知の受信者を登録することです。通知テキストを送信するには、バニラのSMSManager.sendTextMessageを使用して、送信された通知のテキストと通知の無限ループを取得しないようにします。 – Craigy

+0

yah私は自分の問題を解決しました。ありがとうクレイジー。 – anddev

関連する問題