Broadcast Receiver not working for SMS

风格不统一 提交于 2019-12-28 18:04:04

问题


First of all I already searched for possible solutions, tried everything and it still didn't work. I must be missing something.

I am trying to create an app that receives/reads and writes SMS. the write part is working just fine, my broadcast receiver just doesn't catch broadcast.

AndroidManifest.xml

    <uses-permission android:name="android.permission.RECEIVE_SMS" />
    <uses-permission android:name="android.permission.SEND_SMS" />
    <uses-permission android:name="android.permission.WRITE_SMS" /> 
    <uses-permission android:name="android.permission.READ_SMS" /> 
...
        <receiver android:name=".SmsReceiver"
            android:permission="android.permission.BROADCAST_SMS">
        <intent-filter>
            <action android:name="android.provider.Telephony.SMS_RECEIVED" />
        </intent-filter>
        </receiver>

SmsReceiver.java

public class SmsReceiver extends BroadcastReceiver {

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

    Toast.makeText(context, "ON RECEIVE BROADCAST", Toast.LENGTH_LONG).show();
    Log.d("ON ","RECEIVE");
     Bundle bundle = intent.getExtras();
        Object[] messages = (Object[]) bundle.get("pdus");
        SmsMessage[] sms = new SmsMessage[messages.length];
        // Create messages for each incoming PDU
        for (int n = 0; n < messages.length; n++) {
            sms[n] = SmsMessage.createFromPdu((byte[]) messages[n]);
        }
        for (SmsMessage msg : sms) {
            Log.e("RECEIVED MSG",":"+msg.getMessageBody());
            // Verify if the message came from our known sender

        }
}

none of the Logs or toasts are fired.

Tried changing action on manifest to android.intent.action.AIRPLANE_MODE just to test the declaration and the broadcast was received, is just not working for the SMS.

UPDATED

Tried on a different phone and it worked. Must be because I am using Handcent SMS, and some how its blocking the broadcast. Either way I need it to be working on every phone independent of the applications installed.


回答1:


Try declaring your receiver as the following :

<receiver android:name=".SmsReceiver" android:permission="android.permission.BROADCAST_SMS" android:exported="true">
    <intent-filter android:priority="5822" >
        <action android:name="android.provider.Telephony.SMS_RECEIVED" />
    </intent-filter>
 </receiver>

this works just fine for me , I only added a flag to tell that this receiver is exported.

Edit: I forgot to add the priority to the intent filter. use high number for the priority.




回答2:


Found a topic that answers my doubt: Suppress / Block BroadcastReceiver in another app.

Even with the priority set to the maximum possible (999), if another app has the same priority, in this case the Handcent SMS app, the first application that will receive the broadcast is the one that was first installed by the user.

In my case was the Handcent SMS and because it aborts the broadcast when receiving it, my app doesn't receive anything.




回答3:


I have tried everything and it worked on many phones but not mine,I tried to ask for permission in rum time (I have nexus 5 version 23). it worked for me.




回答4:


As @Maxim Toyberman said, you need to ask for permission at runtime (as explained here https://stackoverflow.com/a/35972161/3427883 )

basically you need to make sure you have the permission to Receive the SMS ass following

        if (ContextCompat.checkSelfPermission(this,
            Manifest.permission.RECEIVE_SMS) != PackageManager.PERMISSION_GRANTED) {
        ActivityCompat.requestPermissions(this,
                new String[]{Manifest.permission.RECEIVE_SMS}, 1);


来源:https://stackoverflow.com/questions/19500381/broadcast-receiver-not-working-for-sms

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!