2015-09-01 16 views
15

Próbuję uzyskać numer telefonu i nazwę książki telefonicznej z wiadomości tekstowej. Gdy uruchomię go z aplikacji i zamknę aplikację, działa, ale po ponownym uruchomieniu telefonu komórkowego nie działa. Ktoś?Odbiornik transmisji SMS nie działa po ponownym uruchomieniu

public class IncomingSMSReceiver extends BroadcastReceiver { 
    private static final String queryString = "@zovi"; 
    private static final String SMS_RECEIVED = "android.provider.Telephony.SMS_RECEIVED"; 

    public void onReceive(Context _context, Intent _intent) { 
     if (_intent.getAction().equals(SMS_RECEIVED)) { 
      Intent intent = new Intent(_context, IncomingSMSService.class); 
      _context.startService(intent); 
      Bundle bundle = _intent.getExtras(); 
      if (bundle != null) { 
       Object[] pdus = (Object[]) bundle.get("pdus"); 
       SmsMessage[] messages = new SmsMessage[pdus.length]; 
       for (int i = 0; i < pdus.length; i++) 
        messages[i] = SmsMessage.createFromPdu((byte[]) pdus[i]); 
       for (SmsMessage message : messages) { 
        String msg = message.getMessageBody(); 
        Log.i("Poruka", msg); 
        String to = message.getOriginatingAddress(); 
        String contactName = TelefonUtils.getContact(_context, to); 
        Log.i("Od", contactName + "\n" + to); 
       } 
      } 
     } 
    } 
} 

Moje XML:

<receiver android:name=".telefon.receivers.IncomingSMSReceiver" 
      android:permission="android.permission.BROADCAST_SMS"> 
    <intent-filter android:priority="500"> 
     <action android:name="android.provider.Telephony.SMS_RECEIVED" /> 
    </intent-filter> 
</receiver> 
+0

pan zamknąć aplikację przed ponownym uruchomieniem urządzenia? Jakiej wersji Androida używasz? –

+0

utwórz kolejny odbiornik dla BOOT_COMPLETE. i zarejestruj swój odbiornik msg w nim .. – Moinkhan

+0

dodaj również tę akcję '' w Filtrze intencji – Moinkhan

Odpowiedz

1

Idealnie powinno mieć worked.Is dziwne, że jej nie działa.

Usuń android: permission = "android.permission.BROADCAST_SMS" z odbiornika broadcast.It nie jest wymagane.

Spróbuj maksymalnie zwiększyć priorytet android:priority="2147483647". Być może inna aplikacja zużywa to wydarzenie lub wypróbuje poniższe rozwiązanie.

Dodaj <action android:name="android.intent.action.BOOT_COMPLETED" /> w swoim filtrze zamiany i sprawdź, czy działa.

coś takiego:

<receiver android:name=".telefon.receivers.IncomingSMSReceiver" 
      android:permission="android.permission.BROADCAST_SMS"> 
    <intent-filter android:priority="500"> 
     <action android:name="android.provider.Telephony.SMS_RECEIVED" /> 
     <action android:name="android.intent.action.BOOT_COMPLETED" /> 
    </intent-filter> 
</receiver> 

i dodać uprawnienie:

<uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED"></uses-permission>  
+0

próbowałem, nie działa. Również wypróbowane wywołanie działalności od odbiornika BOOT_COMPLETED, również nie działa ... –

+0

@MiljanVulovic dodałaś pozwolenie –

+0

tak. Mam jeden odbiornik BOOT_COMPLETED, działa, tylko ta przychodząca wiadomość nie jest –

3

Upewnij się, że odbiornik rozpoczyna się po ponownym uruchomieniu telefonu.

Dodaj <action android:name="android.intent.action.BOOT_COMPLETED" /> w intent-filter

+0

nie działa w ten sposób. –

+0

Spróbuj dodać do pliku manifestu uprawnienia do rozruchu, takie jak '' –

1

Trzeba wyjąć z Androidem: Permission = "android.permission.BROADCAST_SMS" z deklaracji odbiornika. Nie jest wymagane BOOT_COMPLETED lub inne pozwolenie.

1

jawnie ustawić exported do true w swoim manifeście jako element do Receiver

android:exported="true" 

i upewnij się, że oba Twój elementem aplikacji i odbiornik elementem są włączone

android:enabled="true" 
+0

również to wypróbował. –

+0

spróbuj tego sir, dodaj Log jako pierwszy wiersz bezpośrednio w onReceive i sprawdź, czy zostanie on wywołany, jeśli zrobi to szybko swój kod, to możemy tam diggować @ VulovicVukasin – Elltz

+0

dodaliśmy logowanie na początku każdego odbiornika. Wszystko zostanie wywołane po ponownym uruchomieniu tylko odbiornik SMS nie robi. –

1

kod Broadcast wydaje się być okay i upewnij się, że używasz w swoim urządzeniu dowolnych innych aplikacji do SMS-ów (niech to rozgłaszanie SMS-ów może przerwać transmisję Twoich aplikacji). Jeśli nie korzystasz z innych aplikacji do SMS-ów, to powinno działać inaczej, odinstaluj aplikację SMS i spróbuj raz.

a także sprawdzić, które zostały dodane następujące uprawnienia w AndroidManifest.xml

<uses-permission android:name="android.permission.SEND_SMS" /> 
<uses-permission android:name="android.permission.READ_SMS"/> 
<uses-permission android:name="android.permission.RECEIVE_SMS" /> 
<uses-permission android:name="android.permission.WRITE_SMS" /> 

nadzieję, że to zadziała.

9

W swojej AndroidManifest.xml spróbuj dodać <action android:name="android.intent.action.BOOT_COMPLETED" /> akcję pod znacznikiem odbiornika .

Automatyczne uruchamianie Services lub BroadcastReceiver po ponownym uruchomieniu systemu Android lub uruchomieniu rejestracji BroadcastReceiver na wydarzenie systemowe systemu Android android.intent.action.BOOT_COMPLETED.

Spróbuj tego kodu.

<receiver android:name=".telefon.receivers.IncomingSMSReceiver" 
android:permission="android.permission.BROADCAST_SMS"> 
     <intent-filter android:priority="500"> 
     <action android:name="android.provider.Telephony.SMS_RECEIVED" /> 
     <action android:name="android.intent.action.BOOT_COMPLETED" /> 
</intent-filter> 

Jeśli próbowałeś android.intent.action.BOOT_COMPLETED to nie będzie działać w Twoim przypadku, ponieważ zapomniał dodać BOOT_COMPLETED woli w swoim
IncomingSMSReceiver i będzie działać tylko w przypadku android.provider.Telephony.SMS_RECEIVED powodu jeśli warunek cię użyłem w IncomingSMSReceiver. tak zmienić, jeśli stan z

if (_intent.getAction().equals(SMS_RECEIVED)) { 

do

if (_intent.getAction().equals(SMS_RECEIVED) || _intent.getAction().equals(BOOT_COMPLETED)) { 

a także zdefiniować private static final String BOOT_COMPLETED = "android.intent.action.BOOT_COMPLETED"; w IncomingSMSReceiver. Poniżej znajduje się pełny kod IncomingSMSReceiver.

Zmień swój kod IncomingSMSReceiver do tego:

public class IncomingSMSReceiver extends BroadcastReceiver { 
    private static final String queryString = "@zovi"; 
    private static final String SMS_RECEIVED = "android.provider.Telephony.SMS_RECEIVED"; 
    private static final String BOOT_COMPLETED = "android.intent.action.BOOT_COMPLETED"; 

    public void onReceive(Context _context, Intent _intent) { 
     if (_intent.getAction().equals(SMS_RECEIVED) || _intent.getAction().equals(BOOT_COMPLETED)) { 
      Intent intent = new Intent(_context, IncomingSMSService.class); 
      _context.startService(intent); 
      Bundle bundle = _intent.getExtras(); 
      if (bundle != null) { 
       Object[] pdus = (Object[]) bundle.get("pdus"); 
       SmsMessage[] messages = new SmsMessage[pdus.length]; 
       for (int i = 0; i < pdus.length; i++) 
        messages[i] = SmsMessage.createFromPdu((byte[]) pdus[i]); 
       for (SmsMessage message : messages) { 
        String msg = message.getMessageBody(); 
        Log.i("Poruka", msg); 
        String to = message.getOriginatingAddress(); 
        String contactName = TelefonUtils.getContact(_context, to); 
        Log.i("Od", contactName + "\n" + to); 
       } 
      } 
     } 
    } 
} 

Więc kiedy ponownym uruchomieniu telefonu otrzyma android.intent.action.BOOT_COMPLETED i nazywają odbiornik IncomingSMSReceiver potem rozpocznie swoją IncomingSMSService.

Mam nadzieję, że ci to pomoże.

2

użyłem w moim projekcie, że ta od Android SMS Receive Listener

import android.content.BroadcastReceiver; 
import android.content.Context; 
import android.content.Intent; 
import android.os.Bundle; 
import android.telephony.SmsMessage; 

import java.util.ArrayList; 

/** 
* @@author Chathura Wijesinghe <[email protected]> 
* 
* <receiver android:name=".SMSReceiver" > 
     <intent-filter> 
      <action android:name="android.provider.Telephony.SMS_RECEIVED"/> 
     </intent-filter> 
    </receiver> 
*/ 
public class SMSReceiver extends BroadcastReceiver { 

private static final String SMS_RECEIVED   = "android.provider.Telephony.SMS_RECEIVED"; 

private static ArrayList<SMSReceivedListner> smsListner = new ArrayList<SMSReceivedListner>(); 

@Override 
public void onReceive(Context context, Intent intent) { 
    final String action = intent.getAction(); 
    final Bundle extras = intent.getExtras(); 


    if (action.equals(SMSReceiver.SMS_RECEIVED)) { 
     final boolean smsValid = extras != null; 

     if (smsValid) { 
      //Create SMSMessages from PDUs in the Bundle 
      final Object[] pdus = (Object[])extras.get("pdus"); 
      final SmsMessage[] messages = new SmsMessage[pdus.length]; 
      for (int i = 0; i < pdus.length; i++) 
       messages[i] = SmsMessage.createFromPdu((byte[])pdus[i]); 

      //Assemble 
      final ArrayList<Long> vibrations = new ArrayList<Long>(); 

      for (SmsMessage message : messages) { 
       for (SMSReceivedListner smsReceivedListner : smsListner) 
        smsReceivedListner.message(message); 
      } 
     } 
    } 
} 

public static void addSMSListner(SMSReceivedListner listner){ 
    smsListner.add(listner); 
} 

public static void removeSMSListner(SMSReceivedListner listner){ 
    smsListner.remove(listner); 
} 

public interface SMSReceivedListner{ 
    public void message(SmsMessage message); 
} 
}