2017-12-13 31 views
1

私のアプリはジオフェンシングに関するものです。ジオフェンスが起動されたら、SMSを送信する必要があります。インテントサービスからSMSを送信する - SMSが送信されたかどうかを確認するためにブロードキャストを受信できません

これはほぼ完璧ですが、SMSが送信されたかどうかを確認するためにブロードキャストを受信することはできません。私は自分自身を説明します:

ユーザーがジオフェンスを入力すると、ジオフェンスインテントサービスが呼び出され、SMSが送信されます。それは魅力的なように機能しますが、SMSが送信されたか、何らかのトラブル(信号がない)があって再送信しようとしているかどうかを確認する必要があります。

だから、最初に私は、SMSをこのように送信しようとしている:

private void sendsms() { 

     String SMS_SENT = "SMS_SENT"; 
     final PendingIntent sentPendingIntent = PendingIntent.getBroadcast(this, 0, new Intent(), PendingIntent.FLAG_UPDATE_CURRENT); 

// check if SMS has been sent 
     smsSentReceiver =new BroadcastReceiver() { 
      @Override 
      public void onReceive(Context context, Intent intent) { 
       switch (getResultCode()) { 
        case Activity.RESULT_OK: 
         Log.e("SMS", "SMS sent successfully"); 
         break; 
        case SmsManager.RESULT_ERROR_GENERIC_FAILURE: 
         Log.e("SMS","Generic failure cause"); 
         break; 
        case SmsManager.RESULT_ERROR_NO_SERVICE: 
         Log.e("SMS", "Service is currently unavailable"); 
         break; 
        case SmsManager.RESULT_ERROR_NULL_PDU: 
         Log.e("SMS", "No pdu provided"); 
         break; 
        case SmsManager.RESULT_ERROR_RADIO_OFF: 
         Log.e("SMS", "Radio was explicitly turned off"); 
         break; 
       } 
      } 
     }; 


     registerReceiver(smsSentReceiver, new Intent()); 

     // Get the default instance of SmsManager 
     // Send a text based SMS 
     SmsManager smsMgr = SmsManager.getDefault(); 
     smsMgr.sendTextMessage(towhom, null, customtxt, sentPendingIntent, null); 

これは働かないが、SMSが送信された後に何も起こらない、まったくのログ。その後

は、私は受信機を作成し、マニフェストに入れて、この他の方法を試してみました:

private smsSentReceiver smsSentReceiver; 

private void sendsms() { 

     final PendingIntent sentPendingIntent = PendingIntent.getBroadcast(this, 0, new Intent(), PendingIntent.FLAG_UPDATE_CURRENT); 

     smsSentReceiver = new smsSentReceiver(); 
     registerReceiver(smsSentReceiver, new IntentFilter()); 

     // Get the default instance of SmsManager 
     // Send a text based SMS 
     SmsManager smsMgr = SmsManager.getDefault(); 
     smsMgr.sendTextMessage(towhom, null, customtxt, sentPendingIntent, null); 

そして、これはsmsSentReceiver.java

public class smsSentReceiver extends BroadcastReceiver { 

    @Override 
    public void onReceive(Context context, Intent intent) { 
     switch (getResultCode()) { 
      case Activity.RESULT_OK: 
       Log.e("SMS", "SMS sent successfully"); 
       break; 
      case SmsManager.RESULT_ERROR_GENERIC_FAILURE: 
       Log.e("SMS","Generic failure cause"); 
       break; 
      case SmsManager.RESULT_ERROR_NO_SERVICE: 
       Log.e("SMS", "Service is currently unavailable"); 
       break; 
      case SmsManager.RESULT_ERROR_NULL_PDU: 
       Log.e("SMS", "No pdu provided"); 
       break; 
      case SmsManager.RESULT_ERROR_RADIO_OFF: 
       Log.e("SMS", "Radio was explicitly turned off"); 
       break; 
     } 
    } 
} 

とマニフェストです:

<receiver 
      android:name=".smsSentReceiver" 
      android:enabled="true" 
      > 

     </receiver> 

SMSステータスについてのログもありません...

なぜ私はSMSステータスを取得していないのですか?

PS:唯一のエミュレータ上でテストしました

編集:私が試した

最後のものは@マイクM.コメントによると、これを次のとおりです。

private void sendsms() { 

     final PendingIntent sentPendingIntent = PendingIntent.getBroadcast(this, 0, new Intent(this, smsSentReceiver.class), PendingIntent.FLAG_CANCEL_CURRENT); 

SmsManager smsMgr = SmsManager.getDefault(); 
     smsMgr.sendTextMessage(towhom, null, customtxt, sentPendingIntent, null); 

そして、まだ何も..

+1

'IntentService'は' onHandleIntent() 'が終了すると自動的に停止するので、動的に登録されたReceiverでブロードキャストを取得することはありません。しかし、両方の試みで同じ問題があります。現在は 'new Intent()'です。それはどこにも行きません。マニフェストに ''要素が正しく指定されていれば、静的に登録された要素を 'new Intent(this、smsSentReceiver.class)'に変更すると動作します。そのスニペット内の 'smsSentReceiver'インスタンスと' registerReceiver() 'コールは、静的に登録されたクラスでは不要なので削除できます。 –

+0

* smsが送信された後は何も起こりません。ログは一切ありません。*コードを共有していないので、わからないことがあります。しかし、私はあなたのインテントサービスが既に完了し、イベントが送信される時点で停止していると推測しています –

+0

@MikeM。あなたが言った帽子を試しました。私はこれを変更しました: final PendingIntent sentPendingIntent = PendingIntent.getBroadcast(0、新しいインテント(this、smsSentReceiver.class)、PendingIntent.FLAG_CANCEL_CURRENT); まだ動作していません... – algarrobo

答えて

1

IntentServiceは、作業が終了するとすぐに停止し、動的に登録されたレシーバーも消えます。あなたの最初のスニペットでは、sendTextMessage()コールがすぐに返され、PendingIntentが非同期で起動されるため、Receiverは最終的に送信されたときにブロードキャストを受信することはできません。

2番目のスニペットで行ったように、Receiverクラスを静的に登録すると、IntentServiceが終了した後でもReceiverがブロードキャストを受信できるようになります。その結果Receiverインスタンスは結び付けられません。ただし、PendingIntentに使用したは、Receiverクラスを正しくターゲティングしていません。それをnew Intent(this, smsSentReceiver.class)に変更します。

最後に、何らかの理由でlogs with certain tags are suppressed"SMS"タグ(正確に)がそのうちの1つです。そのタグをそこにリストされていないものに変更してください。例:"smsSentReceiver"

関連する問題