12

La mia app deve essere in grado di ricevere messaggi SMS. E tutte le opere, ma ottengo questo lint avvertimento:Come risolvere Avviso SMS ignifugo BroadcastReceiver non protetto

BroadcastReceivers che dichiarano un intent-filtro per Distribuzione_di_SMS o SMS_RECEIVED deve garantire che il chiamante ha la BROADCAST_SMS il permesso, altrimenti è possibile che gli attori malintenzionati di falsificare intenti.

Come "assicurarmi che il chiamante abbia l'autorizzazione BROADCAST_SMS"?

Nel mio manifesto ho:

<uses-permission android:name="android.permission.RECEIVE_SMS" /> 
<application ...> 
    <receiver 
     android:name=".SmsReceiver" 
     android:enabled="true" 
     android:exported="true"> 
     <intent-filter android:priority="1000"> 
      <action android:name="android.provider.Telephony.SMS_RECEIVED" /> 
     </intent-filter> 
    </receiver> 
</application> 

Il mio codice:

public class SmsReceiver extends BroadcastReceiver { 
    public SmsReceiver() {} 

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

     final Bundle bundle = intent.getExtras(); 
     if (bundle != null) { 
      final Object[] pdusObj = (Object[]) bundle.get("pdus"); 
      for (int i = 0; i < pdusObj.length; i++) { 
       final SmsMessage currentMessage = SmsMessage.createFromPdu((byte[]) pdusObj[i]); 
       // use currentMessage 
      } 
     } 
    } 
} 

risposta

20

Aggiungere android:permission="android.permission.BROADCAST_SMS" all'apertura <receiver> tag.

Inoltre, i componenti sono abilitati per impostazione predefinita e lo <intent-filter> lo esporta, quindi non è necessario includere esplicitamente tali attributi.

<receiver 
    android:name=".SmsReceiver" 
    android:permission="android.permission.BROADCAST_SMS"> 
+1

Perché questa autorizzazione richiesta? – UnKnown

+1

@UnKnown L'attributo 'permesso' su un' 'specifica quale permesso deve essere conservato _sender_ della trasmissione in modo che sia in grado di trasmettere al tuo' '. È una misura di sicurezza; in questo caso, quindi puoi essere relativamente certo che il sistema sta inviando la trasmissione "SMS_RECEIVED'. Non è strettamente richiesto, ma lint si lamenterà se non è lì. –

0

Il mio codice:

public class SmsReceiver extends BroadcastReceiver { 
public SmsReceiver() {} 

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

    final Bundle bundle = intent.getExtras(); 
    if (bundle != null) { 
     final Object[] pdusObj = (Object[]) bundle.get("pdus"); 
     for (int i = 0; i < pdusObj.length; i++) { 
      final SmsMessage currentMessage = SmsMessage.createFromPdu((byte[]) pdusObj[i]); 
      // use currentMessage 
     } 
    } 
} 
} 
Problemi correlati