3

私はSMSを送信するアプリを開発しています.SMSが送信されたかどうかを知るための応答を得ることができます. しかし、どの SMS が (受信者とテキストによって) 送信されたかを識別したいので、これらの情報をintentusingに追加しextrasます。

それはうまくいきますが、私が送信した最初のメッセージに対してのみです。最初のメッセージの後、同じエクストラを受け取り、いつも同じ SMS を送信したようです。実際、各 SMS は正しく送信されているため、問題は「送信済み通知」のみです。奇妙なことに、別のSMSを受信すると、再び正常に機能します(正しいエクストラを取得します)が、1つのSMSに対してのみです。新しい SMS イベントは、送信されたメッセージのブロードキャスト レシーバを「リセット」するようです。

これは私のコードです:

class SmsSender{
private final String SENT = "SMS_SENT";
private static SmsSender instance=null;
private BroadcastReceiver br;
SmsSender(){}

    //SINGLETON
public static SmsSender getSmsSender(Context ctx, AddressBook ab, DBManager dbm){
    if(instance==null && ctx!=null){
    instance=new SmsSender();
    instance.ctx=ctx;
    instance.ab=ab;
    instance.dbm=dbm;
    instance.setBR();
    }
    return instance;
}

private void setBR(){
    br=new BroadcastReceiver(){
         public void onReceive(Context arg0, Intent arg1) 
            {  
                br=null;

                switch (getResultCode())                
                {              
                case Activity.RESULT_OK:  
                    if(arg1.hasExtra("text") && arg1.hasExtra("receiver")){
                            Log.i("SMS","SMS sent to "+arg1.getStringExtra("receiver")+": "+arg1.getStringExtra("text"));
                    }
                break;
                    .....
                 }
            }
        };

        ctx.registerReceiver(br, new IntentFilter(SENT));

}

public void send(String phoneNumber, String text) {
    String nums[]=phoneNumber.split(",");


    for(int i=0; i<nums.length; ++i){
    if(nums[i]!="" && text!=""){
                SmsManager sms = SmsManager.getDefault();

                ArrayList<String> parts = sms.divideMessage(text);
                messageCount = parts.size();
                ArrayList<PendingIntent> sentIntents = new ArrayList<PendingIntent>(messageCount);
                Intent myIntent=new Intent(SENT);

                **myIntent.putExtra("receiver", nums[i]);
                myIntent.putExtra("text", text);**

                for (int j = 0; j < messageCount; j++){
                    sentIntents.add(PendingIntent.getBroadcast(ctx, 0, myIntent,0));
                }

                    sms.sendMultipartTextMessage( nums[i].trim(), null, parts, sentIntents, null);
            }else{
            Notifica.notify(ab.getContactName(nums[i])+": Error sending SMS",ctx);
            }}


 }}

なにが問題ですか?

4

1 に答える 1

4

最後に、この行を置き換えるだけで問題を解決しました:

sentIntents.add(PendingIntent.getBroadcast(ctx, 0, myIntent,0));

これで:

sentIntents.add(PendingIntent.getBroadcast(ctx, 0, myIntent,PendingIntent.FLAG_UPDATE_CURRENT));

ドキュメントから

FLAG_UPDATE_CURRENT ...記述された PendingIntent が既に存在する場合は、それを保持しますが、余分なデータをこの新しい Intent にあるものに置き換えます。これは、エクストラのみが変更されるインテントを作成している場合に使用できます。以前の PendingIntent を受け取ったエンティティは、明示的に与えられていなくても、新しいエクストラでそれを起動できることを気にしません。

于 2012-04-30T12:09:44.137 に答える