2017-06-15 1 views
0

J'écris une application qui écoute les SMS entrants. J'ai vérifié beaucoup de questions et de réponses en ligne mais ça ne marche toujours pas. Mes codes:Récepteur SmsBroadcast ne fonctionne pas

Mon AndroidManifest.xml:

<manifest xmlns:android="http://schemas.android.com/apk/res/android" 
xmlns:tools="http://schemas.android.com/tools" 
package="superapp.networkapp"> 
<!--send and read SMS--> 
<uses-permission android:name="android.permission.SEND_SMS" /> 
<uses-permission android:name="android.permission.RECEIVE_SMS" /> 
<uses-permission android:name="android.permission.READ_SMS" /> 

<application 
    android:allowBackup="true" 
    android:icon="@mipmap/ic_launcher" 
    android:label="@string/app_name" 
    android:supportsRtl="true" 
    android:theme="@style/AppTheme"> 

    <activity 
     android:name=".activity.MainActivity" 
     android:configChanges="keyboardHidden|orientation|screenSize" 
     android:screenOrientation="portrait"> 
    </activity> 

    <receiver android:name=".utility.tool.SmsReceiver" > 
     <intent-filter android:priority="2147483647"> 
      <action android:name="android.provider.Telephony.SMS_RECEIVED" /> 
     </intent-filter> 
    </receiver> 
    <activity 
     android:name=".activity.StartTestActivity" 
     android:configChanges="keyboardHidden|orientation|screenSize" 
     android:screenOrientation="portrait" 
     tools:replace="screenOrientation"> 
     <intent-filter> 
      <action android:name="android.intent.action.MAIN" /> 

      <category android:name="android.intent.category.LAUNCHER" /> 
     </intent-filter> 
    </activity> 
</application> 

Mon Utilitaire/Outils/SmsReceiver.java

package superapp.networkapp.utility.tool; 

import ... 

public class SmsReceiver extends BroadcastReceiver { 
    //referenced from https://stackoverflow.com/questions/7089313/android-listen-for-incoming-sms-messages 
    @Override 
    public void onReceive(Context context, Intent intent) { 
     // TODO Auto-generated method stub 
     Log.d("SMS", "onReceive: "); 
     if (intent.getAction().equals("android.provider.Telephony.SMS_RECEIVED")) { 
      //---get the SMS message passed in--- 
      Bundle bundle = intent.getExtras();   
      SmsMessage[] messages = null; 
      String sender; 
      if (bundle != null) { 
       //---retrieve the SMS message received--- 
       try { 
        Object[] pdus = (Object[]) bundle.get("pdus"); 
        if (pdus != null) { 
         messages = new SmsMessage[pdus.length]; 
         for(int i=0; i<messages.length; i++){ 
          messages[i] = SmsMessage.createFromPdu((byte[])pdus[i]); //TODO 
          sender = messages[i].getOriginatingAddress(); 
          String msgBody = messages[i].getMessageBody(); 
          Toast.makeText(context,"Message: "+ msgBody + " from " + sender,Toast.LENGTH_LONG).show(); 
         } 
        } 
       } catch(Exception e){ 
        e.printStackTrace(); 
       } 
      } 
     } 
    } 
} 

Je fonction askPermissions() en cours d'exécution dans l'exécution

private static final List<String> permissions = Arrays.asList(
      Manifest.permission.SEND_SMS, 
      Manifest.permission.READ_SMS, 
      Manifest.permission.RECEIVE_SMS); 
    private void askPermissions() { 
     if (!hasAllPermissions()) 
      ActivityCompat.requestPermissions(this, permissions.toArray(new String[0]), 69); 
    } 
    private boolean hasPermission(String permission) { 
     return ContextCompat.checkSelfPermission(this, permission) == PackageManager.PERMISSION_GRANTED; 
    } 

    private boolean hasAllPermissions() { 
     for (String permission : permissions) { 
      if (!hasPermission(permission)) return false; 
     } 
     return true; 
    } 

J'ai 3 appareils: Un Samsung S7 et un Sony Xperia Z5 Compact à la fois en utilisant Android 7.0, et un Samsung S6 en utilisant Android 6.0.1. Lorsque j'envoie des messages à ces appareils, seules les applications de messagerie par défaut affichent les notifications.

J'ai vérifié les réponses et les questions d'autres personnes. Il semble que les applications de messagerie par défaut aient une priorité intentFilter supérieure ou appellent abortBroadcast(). J'ai également défini la priorité de mon intention d'être le plus grand nombre entier ou 999 tel que défini dans la documentation Android, mais pas de chance pour le moment.

+0

Avez-vous encore inscrit récepteur? –

+0

Oui. Je l'enregistre dans mon AndroidManifest. Xml –

+0

J'ai également essayé d'enregistrer le récepteur par programmation, mais pas de chance encore. –

Répondre

1

Vous pouvez essayer cela, j'ai également eu ce même problème, corrigé en ajoutant la permission. et ne avez pas besoin d'enregistrer votre récepteur programme, mais vous devez demander des autorisations Manifest.permission.READ_SMS

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