2011-07-29 17 views
13

próbuję przechwycić przychodzące wiadomości SMS bezpośrednio po boot_completed ale mam problem z NullPointerException w tej linii:BroadcastReceiver nie działa po BOOT_COMPLETED

Object[] rawMsgs=(Object[])intent.getExtras().get("pdus"); 

Oto mój manifest:

<uses-permission android:name="android.permission.SEND_SMS"></uses-permission> 
    <uses-permission android:name="android.permission.RECEIVE_SMS"></uses-permission> 
    <uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED"></uses- permission> 
    <uses-permission android:name="android.permission.INTERNET"></uses-permission> 
    <uses-permission android:name="android.permission.READ_PHONE_STATE"></uses-permission> 
    <uses-permission android:name="android.permission.ACCESS_FINE_LOCATION"/> 

    <application android:icon="@drawable/icon" android:label="@string/app_name" android:theme="@android:style/Theme.NoTitleBar"> 
     <receiver android:name=".SMSReceiver" 
      android:permission="android.permission.BROADCAST_SMS" 
      > 
      <intent-filter android:priority="1000"> 
       <action  android:name="android.provider.Telephony.SMS_RECEIVED"></action> 
       <action android:name="android.intent.action.BOOT_COMPLETED"></action> 
      </intent-filter> 
     </receiver> 
    </application> 

Odbiornik:

public class SMSReceiver extends BroadcastReceiver 
    { 


    private final LocationListener locationListener = new LocationListener() { 
      public void onLocationChanged(Location location) { 


      } 

      public void onProviderDisabled(String provider){} 
      public void onProviderEnabled(String provider) {} 
      public void onStatusChanged(String provider, int status, Bundle extras) {} 
     }; 

    @Override 
    public void onReceive(Context context, Intent intent) { 


     LocationManager lm = (LocationManager)context.getSystemService(Context.LOCATION_SERVICE); 
     //Get as fine grained location as possible, while saving battery life. 
     Criteria criteria = new Criteria(); 
     criteria.setAccuracy(Criteria.ACCURACY_FINE); 
     criteria.setAltitudeRequired(false); 
     criteria.setBearingRequired(false); 
     criteria.setCostAllowed(true); 
     criteria.setPowerRequirement(Criteria.POWER_LOW); 
     String provider = lm.getBestProvider(criteria, true); 
     Toast toast3 = Toast.makeText(context, "Provider: "+provider, Toast.LENGTH_LONG); 
     toast3.show(); 

     Object[] rawMsgs=(Object[])intent.getExtras().get("pdus"); 

     for (Object raw : rawMsgs) { 
      SmsMessage msg=SmsMessage.createFromPdu((byte[])raw); 
      SmsManager sms = SmsManager.getDefault(); 
      if (msg.getMessageBody().toUpperCase().contains("LOC")) { 
       Log.w("SMS:"+msg.getOriginatingAddress(), 
          msg.getMessageBody()); 
       Toast toast1 = Toast.makeText(context, "Phone Number: "+msg.getOriginatingAddress()+" Message: "+msg.getMessageBody(), Toast.LENGTH_LONG); 
       toast1.show(); 
       abortBroadcast(); 

       if(provider!=null){ 


        lm.requestLocationUpdates(provider, 0, 0, locationListener); 

        if(lm != null) 
        { 

         Location last_good = lm.getLastKnownLocation(provider); 
         if(last_good != null) 
         { 
          Toast.makeText(context, "Got Message from " + msg.getOriginatingAddress() + " , Sending" + last_good.toString(),  Toast.LENGTH_SHORT).show(); 
          //sendSMS(msg.getOriginatingAddress(), "http://maps.google.com?q=" + last_good.convert(last_good.getLatitude(), Location.FORMAT_DEGREES) + "," + last_good.convert(last_good.getLongitude(), Location.FORMAT_DEGREES), context); 

          //sendSMS(msg.getOriginatingAddress(), last_good.getLatitude() + "," + last_good.getLongitude(), context); 
          sms.sendTextMessage(msg.getOriginatingAddress(), null, last_good.getLatitude() + "," + last_good.getLongitude(), null, null); 
          lm.removeUpdates(locationListener); 
         } 
         else 
         { 
          lm.removeUpdates(locationListener); 
           sendSMS(msg.getOriginatingAddress(),"Location Not Available. Possible Reasons: Phone is Off, GPS is Off, No Satellites in sight", context); 

         } 
        } 

       } 
       else{ 
        sendSMS(msg.getOriginatingAddress(),"Location Not Available. Possible Reasons: Phone is Off, GPS is Off, No Satellites in sight", context); 

       } 



      } 
     } 
    } 

Dzięki.

Odpowiedz

15

Problem polega na tym, że twoja implementacja BroadcastReceiver została zmapowana na dwie intencje - android.provider.Telephony.SMS_RECEIVED i android.intent.action.BOOT_COMPLETED - ale w implementacji onReceive nie sprawdzasz, którą intencję przetwarzasz.

Moje domysły jest, że android.intent.action.BOOT_COMPLETED został odebrany i intent.getExtras() zwraca zero. Możesz to potwierdzić, dodając pewne logowanie do metody i obserwując okno logcat (jeśli używasz Eclipse).

Jeśli piszesz usługę lub odbiornik i zamieniasz ją na wiele intencji, dobrą praktyką jest - nie ważne - sprawdzenie, która intencja została odebrana i przetwarzana w odpowiedni sposób. Osobiście chciałbym uzyskać coś takiego:

if (intent.getAction().equals("android.intent.action.BOOT_COMPLETED")) { 
    // boot-related processing here 
} 
else if (intent.getAction().equals("android.provider.Telephony.SMS_RECEIVED")) { 
    // SMS-related processing here 
} 
else { 
    // intent not handled - log as a warning as you've registered to receive it 
} 

Nie można założyć zachowania awaryjnego. Dla jasności, przesuń zamiarem logikę przetwarzania na oddzielnej metody:

if (intent.getAction().equals("android.intent.action.BOOT_COMPLETED")) { 
    processBootCompletedIntent(intent); 
} 
else if (intent.getAction().equals("android.provider.Telephony.SMS_RECEIVED")) { 
    processSmsReceivedIntent(intent); 
} 
else { 
    // intent not handled - log as a warning as you've registered to receive it 
} 

PS - większość (jeśli nie wszystkie) „rodzime” intent ciągi działania odbywają się jako stałe w odpowiedniej klasie. Na przykład android.intent.action.BOOT_COMPLETED jest zdefiniowany jako Intent.ACTION_BOOT_COMPLETED. Używaj stałych tam, gdzie one istnieją, to pozwoli Ci uniknąć błędów przy pisaniu.

+0

Dzięki, spróbuję i zobaczę, jak to działa. – bond

+0

Ustaw również priorytet na 999. –

Powiązane problemy