BroadcastReceiver java android SMS

BroadcastReceiver java android SMS
JU
  • Rejestracja:prawie 12 lat
  • Ostatnio:ponad 6 lat
  • Postów:149
0

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

Kopiuj
 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:

Kopiuj
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:

Kopiuj
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

edytowany 1x, ostatnio: juniorchat
init0
Może system nie daje rady wysyłać tak szybko i ponawia wysyłanie, może jakieś opóźnienie trzeba wstawić. Moge się mylić bo androida znam tylko od strony użytkownika.
JU
Raczej wina leży gdzie indziej bo sms wysyła już po pierwszym info
init0
ale odbiera go dopiero później, chyb a sms ma kontrola jak w protokole tcp gdzie pakiet ma tą kontrole Wysłanie i potwierdzenie prawidłowego odbioru. Ale kłócił się nie będę bo nie jestem pewny.
JU
Właśnie to sprawdziłem. Android automatycznie kolejkuje wysyłanie.
init0
no to sprawa wydaje mi się jasna spójrz na czasy, jak w tym samym czasie chcesz wysłać trzy sms-y? dokładnie ten sam czas co do mikrosekundy , według mnie właśnie android robi to kolejkowanie i powtarza sekwencje do momentu wysłania trzech wiadomości, w mojej opinii jest to awykonalne dla procesora aby wykonał trzy operacje w czasie jednego przerwania; ja widze to tak pierwsze trzy numery to wysłanie jednego z sms-ów, nastepne trzy to wysłanie drugiego, potem nadchodzi odpowiedź po odpowiednim czasie o dostarczeniu sms-a i następnie ostatni (next trzy numery) i odpowiedź;
JU
Niestety ale sprawdziłem to o czym mówisz, czyli: 1. wywołałem sendSMS("+48||||||||1", "SMS"); i po kilkunastu sekundach 2gi raz sendSMS("+48||||||||2", "SMS"); 2. Odpowiedź: wyslany +48||||||||1", "SMS" - dostarczony +48||||||||1", "SMS" -(naciśnięcie 2gi raz wyślij): wyslany +48||||||||1", "SMS" - wyslany +48||||||||2", "SMS" - dostarczony +48||||||||1", "SMS" - dostarczony +48||||||||2", "SMS" Trochę to lipnie wygląda, lecz niestety przeczy twojej tezie:| Mimo to dzięki za wsparcie, i uprzejmie proszę o inne pomysły?
init0
pokaż logi tego twojego sprawdzania bo nie moge w to uwierzyć.
JU
Proszę - dodany w temacie powyżej - po edycji.
init0
A czy w typowej konstrukcji funkcji sendSMS() działa normalnie? takiej najbardziej okrojonej (tylko numer i treść)? [tylko z dwoma ostatnimi linijkami]
JU
2 ostatnie linijki wysyłają tak samo sms... tylko że nie daje raportów, na których mi zależy.
init0
na pewno już to odwiedzałeś ale wyśle dla pewności http://stackoverflow.com/questions/4967448/send-sms-in-android
JU
Jak najbardziej, jednak tam jest odbieranie sms-ów i wysyłanie. A niestety brak info o działających prawidłowo raportach
JU
  • Rejestracja:prawie 12 lat
  • Ostatnio:ponad 6 lat
  • Postów:149
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:

Kopiuj
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:

Kopiuj
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.

JU
Co masz na myśli pisząc coś?
init0
Może masz źle napisaną obsługę logów. Ponieważ zawsze w loga zapisuje Reciver i Deliver ze względu na to że nie masz tam warunku, Tak przynajmniej mi się wydaje, choć możesz jeszcze napisać coś więcej o Activity.RESULT_OK bo nie wiem gdzie jest aktualizacja tej zmiennej u ciebie.
JU
switch (getResultCode()) <<-- tu jest pobierany rezultat i w case jest interpretowany
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.

JU
  • Rejestracja:prawie 12 lat
  • Ostatnio:ponad 6 lat
  • Postów:149
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.

JU
  • Rejestracja:prawie 12 lat
  • Ostatnio:ponad 6 lat
  • Postów:149
0

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

wiciu
  • Rejestracja:ponad 11 lat
  • Ostatnio:5 dni
  • Postów:1205
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:

Kopiuj
<receiver android:name=".SmsReceiver"> 
   <intent-filter> 
      <action android:name="android.provider.Telephony.SMS_RECEIVED" /> 
   </intent-filter> 
</receiver>
edytowany 1x, ostatnio: wiciu
Kliknij, aby dodać treść...

Pomoc 1.18.8

Typografia

Edytor obsługuje składnie Markdown, w której pojedynczy akcent *kursywa* oraz _kursywa_ to pochylenie. Z kolei podwójny akcent **pogrubienie** oraz __pogrubienie__ to pogrubienie. Dodanie znaczników ~~strike~~ to przekreślenie.

Możesz dodać formatowanie komendami , , oraz .

Ponieważ dekoracja podkreślenia jest przeznaczona na linki, markdown nie zawiera specjalnej składni dla podkreślenia. Dlatego by dodać podkreślenie, użyj <u>underline</u>.

Komendy formatujące reagują na skróty klawiszowe: Ctrl+B, Ctrl+I, Ctrl+U oraz Ctrl+S.

Linki

By dodać link w edytorze użyj komendy lub użyj składni [title](link). URL umieszczony w linku lub nawet URL umieszczony bezpośrednio w tekście będzie aktywny i klikalny.

Jeżeli chcesz, możesz samodzielnie dodać link: <a href="link">title</a>.

Wewnętrzne odnośniki

Możesz umieścić odnośnik do wewnętrznej podstrony, używając następującej składni: [[Delphi/Kompendium]] lub [[Delphi/Kompendium|kliknij, aby przejść do kompendium]]. Odnośniki mogą prowadzić do Forum 4programmers.net lub np. do Kompendium.

Wspomnienia użytkowników

By wspomnieć użytkownika forum, wpisz w formularzu znak @. Zobaczysz okienko samouzupełniające nazwy użytkowników. Samouzupełnienie dobierze odpowiedni format wspomnienia, zależnie od tego czy w nazwie użytkownika znajduje się spacja.

Znaczniki HTML

Dozwolone jest używanie niektórych znaczników HTML: <a>, <b>, <i>, <kbd>, <del>, <strong>, <dfn>, <pre>, <blockquote>, <hr/>, <sub>, <sup> oraz <img/>.

Skróty klawiszowe

Dodaj kombinację klawiszy komendą notacji klawiszy lub skrótem klawiszowym Alt+K.

Reprezentuj kombinacje klawiszowe używając taga <kbd>. Oddziel od siebie klawisze znakiem plus, np <kbd>Alt+Tab</kbd>.

Indeks górny oraz dolny

Przykład: wpisując H<sub>2</sub>O i m<sup>2</sup> otrzymasz: H2O i m2.

Składnia Tex

By precyzyjnie wyrazić działanie matematyczne, użyj składni Tex.

<tex>arcctg(x) = argtan(\frac{1}{x}) = arcsin(\frac{1}{\sqrt{1+x^2}})</tex>

Kod źródłowy

Krótkie fragmenty kodu

Wszelkie jednolinijkowe instrukcje języka programowania powinny być zawarte pomiędzy obróconymi apostrofami: `kod instrukcji` lub ``console.log(`string`);``.

Kod wielolinijkowy

Dodaj fragment kodu komendą . Fragmenty kodu zajmujące całą lub więcej linijek powinny być umieszczone w wielolinijkowym fragmencie kodu. Znaczniki ``` lub ~~~ umożliwiają kolorowanie różnych języków programowania. Możemy nadać nazwę języka programowania używając auto-uzupełnienia, kod został pokolorowany używając konkretnych ustawień kolorowania składni:

```javascript
document.write('Hello World');
```

Możesz zaznaczyć również już wklejony kod w edytorze, i użyć komendy  by zamienić go w kod. Użyj kombinacji Ctrl+`, by dodać fragment kodu bez oznaczników języka.

Tabelki

Dodaj przykładową tabelkę używając komendy . Przykładowa tabelka składa się z dwóch kolumn, nagłówka i jednego wiersza.

Wygeneruj tabelkę na podstawie szablonu. Oddziel komórki separatorem ; lub |, a następnie zaznacz szablonu.

nazwisko;dziedzina;odkrycie
Pitagoras;mathematics;Pythagorean Theorem
Albert Einstein;physics;General Relativity
Marie Curie, Pierre Curie;chemistry;Radium, Polonium

Użyj komendy by zamienić zaznaczony szablon na tabelkę Markdown.

Lista uporządkowana i nieuporządkowana

Możliwe jest tworzenie listy numerowanych oraz wypunktowanych. Wystarczy, że pierwszym znakiem linii będzie * lub - dla listy nieuporządkowanej oraz 1. dla listy uporządkowanej.

Użyj komendy by dodać listę uporządkowaną.

1. Lista numerowana
2. Lista numerowana

Użyj komendy by dodać listę nieuporządkowaną.

* Lista wypunktowana
* Lista wypunktowana
** Lista wypunktowana (drugi poziom)

Składnia Markdown

Edytor obsługuje składnię Markdown, która składa się ze znaków specjalnych. Dostępne komendy, jak formatowanie , dodanie tabelki lub fragmentu kodu są w pewnym sensie świadome otaczającej jej składni, i postarają się unikać uszkodzenia jej.

Dla przykładu, używając tylko dostępnych komend, nie możemy dodać formatowania pogrubienia do kodu wielolinijkowego, albo dodać listy do tabelki - mogłoby to doprowadzić do uszkodzenia składni.

W pewnych odosobnionych przypadkach brak nowej linii przed elementami markdown również mógłby uszkodzić składnie, dlatego edytor dodaje brakujące nowe linie. Dla przykładu, dodanie formatowania pochylenia zaraz po tabelce, mogłoby zostać błędne zinterpretowane, więc edytor doda oddzielającą nową linię pomiędzy tabelką, a pochyleniem.

Skróty klawiszowe

Skróty formatujące, kiedy w edytorze znajduje się pojedynczy kursor, wstawiają sformatowany tekst przykładowy. Jeśli w edytorze znajduje się zaznaczenie (słowo, linijka, paragraf), wtedy zaznaczenie zostaje sformatowane.

  • Ctrl+B - dodaj pogrubienie lub pogrub zaznaczenie
  • Ctrl+I - dodaj pochylenie lub pochyl zaznaczenie
  • Ctrl+U - dodaj podkreślenie lub podkreśl zaznaczenie
  • Ctrl+S - dodaj przekreślenie lub przekreśl zaznaczenie

Notacja Klawiszy

  • Alt+K - dodaj notację klawiszy

Fragment kodu bez oznacznika

  • Alt+C - dodaj pusty fragment kodu

Skróty operujące na kodzie i linijkach:

  • Alt+L - zaznaczenie całej linii
  • Alt+, Alt+ - przeniesienie linijki w której znajduje się kursor w górę/dół.
  • Tab/⌘+] - dodaj wcięcie (wcięcie w prawo)
  • Shit+Tab/⌘+[ - usunięcie wcięcia (wycięcie w lewo)

Dodawanie postów:

  • Ctrl+Enter - dodaj post
  • ⌘+Enter - dodaj post (MacOS)