BroadcastReceiver java android SMS

0

Wydaje mi się że coś źle rozumiem, albo robię, tworzę aplikacje do wysyłania SMS-ów z telefonu android, stworzyłem funkcje:

 private void sendSMS(final String phoneNumber, String message)
    {   
        final String SENT = "SMS_SENT";
        String DELIVERED = "SMS_DELIVERED";
        
        final Intent sent = new Intent(SENT);
        int smsID = 0;      
        sent.putExtra("number", phoneNumber);
        PendingIntent sentPI = PendingIntent.getBroadcast(this, smsID++, sent, PendingIntent.FLAG_UPDATE_CURRENT);
        
        int smsID2 = 0;   
        Intent delivery = new Intent(DELIVERED);
        delivery.putExtra("number", phoneNumber);
        PendingIntent deliveredPI = PendingIntent.getBroadcast(this, smsID2++, delivery, PendingIntent.FLAG_UPDATE_CURRENT);
 
        final String DEBUG_TAG = "junior";
        //---when the SMS has been sent---

        registerReceiver(new BroadcastReceiver(){
            @Override
            public void onReceive(Context arg0, Intent arg1) 
            {
                switch (getResultCode())
                {
                    case Activity.RESULT_OK:
                        //Toast.makeText(getBaseContext(), "SMS sent", Toast.LENGTH_SHORT).show();
                        Log.d(DEBUG_TAG,  "SMS Wysłany "+sent.getStringExtra("number"));
                        break;
                } 
            }
        }, new IntentFilter(SENT));
        
        //---when the SMS has been delivered---
        registerReceiver(new BroadcastReceiver()
        {
            @Override
            public void onReceive(Context arg0, Intent arg1) {
                switch (getResultCode())
                {
                    case Activity.RESULT_OK:
                        //Toast.makeText(getBaseContext(), "SMS delivered",Toast.LENGTH_SHORT).show();
                        Log.d(DEBUG_TAG,  "SMS Dostarczony "+phoneNumber);
                        break;                    
                }
            }
        }, new IntentFilter(DELIVERED));        
         
        SmsManager sms = SmsManager.getDefault();
        sms.sendTextMessage(phoneNumber, null, message, sentPI, deliveredPI);        
    }

Funkcje wywołuje tak:

sendSMS("+48|||||||||", "SMS");

I nie wiedzieć czemu, przy wysłaniu jednego sms'a, Log.d działa jak należy, czyli (screen z LogCat):
dziala.png
jednak w momencie wywołania 3 razy numeru, czyli:

sendSMS("+48numer1", "message");
sendSMS("+48numer2","testowy sms");
sendSMS("+48numer3", "testowy");

(zamiast numer1, 2 i 3 są oczywiście istniejące numery telefonu)
pojawia się:
dziala2.png
Kto mi odpowie skąd te powtórki i jak zaradzić, żeby się tylko raz pojawiało odnośnie jednego wysłania, bo mam wrażenie ze to przy każdym sms-ie wykonuje wszystkie numery. Stąd 3 razy powtórka wszystkiego. Ale co z tym zrobić?

Dodam, ze sms wysyła jeden na każdy numer...
Z góry dziękuje za pomoc i zainteresowanie tematem

Edit:
3ci screen na życzenie z komentarzy, czyli naciśniecie 3 razy przycisku wyślij przy jednym numerze:
dziala3.png

0

Dodaje kolejny post ponieważ połowicznie odpowiadam na swoje pytanie.
Ok zrobiłem krok dalej, jednak to jeszcze nie to co chcę osiągnąć.
A mianowicie dodałem:

registerReceiver(new BroadcastReceiver(){
@Override
public void onReceive(Context arg0, Intent arg1) 
{
   switch (getResultCode())
     {...}
   unregisterReceiver(this);
} 
}, new IntentFilter(SENT));

Pozwoliło mi to usunąć powtarzające się wpisy, jednak nadal występuje problem ze statusem wiadomości.
Objawia się on tym, że jak wyłączyłem telefon odbiorcyNr1 (odbiorcyNr2 zostawiłem włączony) i wysłałem sms razem, czyli:

sendSMS("+48||||||||1", "message");
sendSMS("+48||||||||2","testowy sms");

otrzymałem:
dziala4.png
Co jest nieprawdą ponieważ numer2 był wyłączony co oznacza, że nie mógł zostać doręczony.
Śmiem przypuszczać, że to wina tego, że został dostarczony sms do numeru1 i błędna interpretacja mojego programu sprawiła, że wyznaczył oba jako doręczone. Lecz nadal pytanie pozostaje -dlaczego nie rozróżnia raportów?
Powiedzcie mi proszę gdzie jest błąd bo już wymiękam:( Proszę o podpowiedzi, cokolwiek.

0

Witaj,
poradziles sobie z tym? juz troche czasu minelo. Ale wydaje mi sie ze ten status DELIVERED oznacza, ze operator otrzymal smsa i dodal do kolejki przekazania do odbiorcy jak tylko bedzie w zasiegu sieci.

0

NIestety porzuciłem na jakiś czas projekt.Ale jeżeli by by ło jak mówisz, to skąd nasz telefon wie, kiedy sms zostaje dostarczony do odbiorcy?

0

Przede wszystkim brooadcast receivera rejestrujesz w manifeście, a nie w kodzie (musi mieć on ustawiony duży priorytet). Drugą sprawa: możesz dzwonić i wysyłać smsy pomiędzy dwoma emulatorami, nie trzeba tracić realnych pieniędzy na testy.

0

Możesz rozwinąć myśl o manifeście?
Co do 2giej sprawy - w erze darmowych smsów nie robi mi to różnicy ;)

0
juniorchat napisał(a):

Możesz rozwinąć myśl o manifeście?
[...]

Zamiast tworzyć "anonimowego" obiektu, stwórz sobie klasę "SmsReceiver", która będzie dziedziczyć po klasie "BroadcastReceiver" i w niej zdefiniuj wszystkie potrzebne operacje.
Następnie zarejestruj w Manifeście swój "SmsReceiver" w następujący sposób:

<receiver android:name=".SmsReceiver"> 
   <intent-filter> 
      <action android:name="android.provider.Telephony.SMS_RECEIVED" /> 
   </intent-filter> 
</receiver>

1 użytkowników online, w tym zalogowanych: 0, gości: 1