2017-01-26 12 views
1

私はいくつかのカスタムリスナーを作成したAndroid用のシンプルなSMSライブラリを作成しようとしています。イベントが発生するたびにそのリスナーをトリガーしたい。 SMSが送信されたか失敗しました。私はSMSを送受信できますが、リスナーイベントは呼び出されません。リスナーは常にNullを返します。どこに間違っているのか誰にでも教えてくれますか?コールバックリスナーは常にnullを返します

public class SendSMS { 

    private OnSMSListener listener; 

    public void OnSMSListener(OnSMSListener listener) { 
     this.listener = listener; 
    } 

    public SendSMS(Context context) { 
     Holder.setContext(context); 
     this.listener = null; 

    } 


    public void setNumber(String number) { 
     Holder.setMobNumber(number); 

    } 

    public void setMessage(String message) { 
     Holder.setMessage(message); 
    } 

    public void sendMessage() { 
     ImplSendSms.sendTextMessage(listener); 
    } 

    /** 
    * Interface definition for a callback to be invoked 
    */ 
    public interface OnSMSListener { 

     void onSmsSent(); 

     void onGenericFailure(); 

     void onNoService(); 

     void onNullPdu(); 

     void onRadioOff(); 
    } 

MyImplSendSms.classファイル:

public class ImplSendSms { 

    public static void sendTextMessage(final SendSMS.OnSMSListener listener) { 

     Toast.makeText(Holder.getContext(), "sendTextMessage", Toast.LENGTH_SHORT).show(); 

     String SENT = "SMS_SENT"; 
     PendingIntent sentPI = PendingIntent.getBroadcast(Holder.getContext(), 0, 
       new Intent(SENT), 0); 

//---when the SMS has been sent--- 
     Holder.getContext().registerReceiver(new BroadcastReceiver() { 
      @Override 
      public void onReceive(Context arg0, Intent arg1) { 
       switch (getResultCode()) { 
        case Activity.RESULT_OK: 
         Toast.makeText(Holder.getContext(), "Inside Sent", Toast.LENGTH_SHORT).show(); 
         if (listener != null) { 
          Toast.makeText(Holder.getContext(), "Inside Sent Listener", Toast.LENGTH_SHORT).show(); 
          listener.onSmsSent(); 
         } 

         break; 
        case SmsManager.RESULT_ERROR_GENERIC_FAILURE: 
         if (listener != null) { 
          listener.onGenericFailure(); 
         } 

         break; 
        case SmsManager.RESULT_ERROR_NO_SERVICE: 
         if (listener != null) { 
          listener.onNoService(); 
         } 
         break; 
        case SmsManager.RESULT_ERROR_NULL_PDU: 
         if (listener != null) { 
          listener.onNullPdu(); 
         } 
         break; 
        case SmsManager.RESULT_ERROR_RADIO_OFF: 
         if (listener != null) { 
          listener.onRadioOff(); 
         } 

         break; 
       } 
      } 
     }, new IntentFilter(SENT)); 


     SmsManager sms = SmsManager.getDefault(); 


     sms.sendTextMessage(Holder.getMobNumber(), null, Holder.getMessage(), sentPI, null); 
    } 

マイMainActivity

SendSMS sms = new SendSMS(MainActivity.this); 
     sms.setMessage("Hello"); 
     sms.setNumber("123456789"); 
     sms.sendMessage(); 
     sms.OnSMSListener(new SendSMS.OnSMSListener() { 
      @Override 
      public void onSmsSent() { 
       Toast.makeText(MainActivity.this, "SMS Sent", Toast.LENGTH_SHORT).show(); 
      } 

      @Override 
      public void onGenericFailure() { 
       Toast.makeText(MainActivity.this, "Generic Failure", Toast.LENGTH_SHORT).show(); 
      } 

      @Override 
      public void onNoService() { 
       Toast.makeText(MainActivity.this, "No Service", Toast.LENGTH_SHORT).show(); 
      } 

      @Override 
      public void onNullPdu() { 
       Toast.makeText(MainActivity.this, "Null PDU", Toast.LENGTH_SHORT).show(); 
      } 

      @Override 
      public void onRadioOff() { 
       Toast.makeText(MainActivity.this, "Radio Off", Toast.LENGTH_SHORT).show(); 
      } 
     }); 
+0

リスナーの登録先はどこですか? –

+1

'OnSMSListener()'をまだ呼び出さなかったので 'sms.sendMessage()'を呼び出すと 'listener'は' SendSMS'でnullになり、 'ImplSendSms.sendTextMessage(listener)'にnullが渡されます。 –

+1

'OnSMSListener'セッターの名前を' setOnSMSListener'のように変更してください – StuStirling

答えて

0

あなたがsendMessage()を呼び出した後、あなたはリスナーを設定しています。次のように変更してください。

sms.OnSMSListener(new SendSMS.OnSMSListener() { 
     @Override 
     public void onSmsSent() { 
      Toast.makeText(MainActivity.this, "SMS Sent", Toast.LENGTH_SHORT).show(); 
     } 

     @Override 
     public void onGenericFailure() { 
      Toast.makeText(MainActivity.this, "Generic Failure", Toast.LENGTH_SHORT).show(); 
     } 

     @Override 
     public void onNoService() { 
      Toast.makeText(MainActivity.this, "No Service", Toast.LENGTH_SHORT).show(); 
     } 

     @Override 
     public void onNullPdu() { 
      Toast.makeText(MainActivity.this, "Null PDU", Toast.LENGTH_SHORT).show(); 
     } 

     @Override 
     public void onRadioOff() { 
      Toast.makeText(MainActivity.this, "Radio Off", Toast.LENGTH_SHORT).show(); 
     } 
    }); 
    sms.sendMessage(); 

PS。あなたのOnSMSListenerはsetOnSMSListener()でなければなりません。

+0

はいこれはうまくいきますが、sendMessage()を最初に使用してリスナーを実装する方法を制限するにはどうすればいいですか? – Aamir

+0

'setMessage(OnSMSListener) smsListener) 'または' SendSMS'クラスのコンストラクタにあります。 – StuStirling

関連する問題