2016-07-16 4 views
0

내 앱은 통화 중/sms 수신시 1 개의 SMS를 보내야한다고 설계되었습니다. 일부 사용자의 경우 , 1 통화/SMS 수신시 여러 SMS가 발송됩니다. 이유가 확실하지 않은 이유는 무엇입니까? 일부 사용자에게는 발생하는 것으로 보입니다 만 모든 사용자에게 발생할 수있는 잠재적 버그 일 수 있음을 알고 있습니다.앱이 통화/SMS 수신시 복수 SMS 보내기

모든 도움을 주시면 대단히 감사하겠습니다.

어딘가에 if + shared pref 부울을 넣어야합니까?

SmsReceiver

public class SmsReceiver extends BroadcastReceiver { 

private String tempMessage = ""; 


@Override 
// when OnRecieve recieves the correct Broadcast. in this case when a sms is recieved 
public void onReceive(Context context, Intent intent) { 


    String action = intent.getAction(); 

    //Toast.makeText(context, "onReceive", Toast.LENGTH_SHORT).show(); 


    if (action.equals("android.provider.Telephony.SMS_RECEIVED")) { 
     //action for sms received 


     // the actual sms will come in the form of a a intent 
     final Bundle bundle = intent.getExtras(); 


     try { 

      if (bundle != null) { 

       final Object[] pdusObj = (Object[]) bundle.get("pdus"); 

       for (int i = 0; i < pdusObj.length; i++) { 

        SmsMessage currentMessage = SmsMessage.createFromPdu((byte[]) pdusObj[i]); 
        String phoneNumber = currentMessage.getDisplayOriginatingAddress(); 


        SharedPreferences preferences = PreferenceManager.getDefaultSharedPreferences(context); 
        SharedPreferences.Editor editor = preferences.edit(); 

        editor.putString("incomingNumber", phoneNumber); 
        editor.commit(); 

        String message = currentMessage.getDisplayMessageBody(); 



        if (!tempMessage.equalsIgnoreCase(message)) { 


         if (phoneNumber.contains("+")) { 


          //TODO after receiver is finished set CHmessageSent pref boolean to false. 
          Boolean messageSent = preferences.getBoolean("CHmessageSent", false); 
          if (!messageSent) { 

           Intent smsIntent = new Intent(context, sendSmsIntentService.class); 
           context.startService(smsIntent); 
           //Toast.makeText(context, "startIntent", Toast.LENGTH_SHORT).show(); 
          } 


          Log.i("SMS_RECEIVER", "senderNumA: " + phoneNumber + "; message: " + message); 


         } 
        } 

       } // End For loop 
      } // bundle is null 

     } catch (Exception e) { 
      Log.e("SmsReciever", "Exeption smsReceiver" + e); 
     } 
    } // END IF ction.equals("android.provider.Telephony.SMS_RECEIVED") 

    } 

} 

SendSmsIntentService

public class sendSmsIntentService extends IntentService { 


private String phoneNumber; 
private String defaultSms = ""; 
private String sms; 


//Creates an IntentService. Invoked by your subclass's constructor. 

public sendSmsIntentService() { 
    super("sendSmsIntentService"); 
} 


@Override 
protected void onHandleIntent(Intent intent) { 


    SharedPreferences preferences = PreferenceManager.getDefaultSharedPreferences(this); 
    SharedPreferences.Editor editor = preferences.edit(); 

    phoneNumber = preferences.getString("incomingNumber", "null"); 



    defaultSms = getString(R.string.drivesafesms); 
    sms = preferences.getString("message1",defaultSms); 

    Log.i("SMS_RECEIVER", "senderNumb: " + phoneNumber); 

    // 


    try { 
     SmsManager smsManager = SmsManager.getDefault(); 
     smsManager.sendTextMessage(phoneNumber, null, sms, null, null); 


     if (!preferences.getBoolean("CHmessageSent",false)) { 
      editor.putBoolean("CHmessageSent", true); 
      editor.commit(); 
     } 

     //Toast.makeText(getApplicationContext(), R.string.receivedCall, Toast.LENGTH_LONG).show(); 

    } catch (Exception e) { 
     e.printStackTrace(); 
     Toast.makeText(getApplicationContext(), R.string.smsFailed, Toast.LENGTH_LONG).show(); 
     Log.i("CALL_RECEIVER", "senderNum: " + phoneNumber); 
    } 

    } 
} 
+0

을 당신은 선 아래로 문제를 만들 수 있습니다 귀하의 IntentService에서 널 (null)에 대한'phoneNumber'을 확인하지 않습니다. 너의 대답에 대해 –

답변

0

IntentService은 하나의 스레드에서 작업을 수행합니다. CHmessageSent이 true로 설정되기 전에 브로드 캐스트가 두 번 연속으로 호출되면 2 개의 메시지가 전송됩니다.

난 당신이 IntentService 내부에이 검사를 이동 권하고 싶습니다 :

Boolean messageSent = preferences.getBoolean("CHmessageSent", false); 
if (!messageSent) { 
    //Send SMS 
editor.putBoolean("CHmessageSent", true).apply(); 
} 
+0

고마워. 아프 지금 시도하십시오. 이 경우에는 .apply()가 더 좋습니다. 또는 .commit(); –

+1

'apply()'가 값을 반환하지 않고 약간 더 빠르다는 점을 제외하면 실제적인 차이점이 없습니다. –

관련 문제