传入的短信不会触发onReceive()

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了传入的短信不会触发onReceive()相关的知识,希望对你有一定的参考价值。

我试图读取传入的文本消息并根据SMS中的文本执行某些操作,但不会触发onReceive()方法。

清单文件

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="com.dost.anshdeep.dosti">
    <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=".MainActivity"
            android:label="@string/app_name"
            android:theme="@style/AppTheme.NoActionBar">
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />

                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>
        <activity
            android:name=".Ringing"
            android:label="@string/title_activity_ringing"
            android:theme="@style/AppTheme.NoActionBar">
            <intent-filter>
                <action android:name="com.dost.anshdeep.dosti.Ringing" />

                <category android:name="android.intent.category.DEFAULT" />
            </intent-filter>
        </activity>
        <activity
            android:name=".Alarms"
            android:label="@string/title_activity_alarms"
            android:theme="@style/AppTheme.NoActionBar">
            <intent-filter>
                <action android:name="com.dost.anshdeep.dosti.Alarms" />

                <category android:name="android.intent.category.DEFAULT" />
            </intent-filter>
        </activity>
        <receiver android:name=".SmsListener">
            <intent-filter>
                <action android:name="android.provider.Telephony.SMS_RECEIVED" />
            </intent-filter>
        </receiver>

    </application>

</manifest>

SMS listener.Java

 public class SmsListener extends BroadcastReceiver {
    @Override
    public void onReceive(Context context, Intent intent) {
        Toast.makeText(context,"Hello",Toast.LENGTH_LONG).show();
        //Log.d("Message Received : ",msgBody);
        if(intent.getAction().equals("android.provider.Telephony.SMS_RECEIVED")){
            Bundle bundle = intent.getExtras();           //---get the SMS message passed in---
            SmsMessage[] msgs = null;
            if (bundle != null){
                //---retrieve the SMS message received---
                try{
                    Object[] pdus = (Object[]) bundle.get("pdus");
                    msgs = new SmsMessage[pdus.length];
                    for(int i=0; i<msgs.length; i++){
                        msgs[i] = SmsMessage.createFromPdu((byte[]) pdus[i]);
                        String msg_from = msgs[i].getOriginatingAddress();
                        String msgBody = msgs[i].getMessageBody();
                    }
                }catch(Exception e){
                            Log.d("Exception caught", e.getMessage());
                }
            }
        }
        //Toast.makeText(context,msg_from,Toast.LENGTH_LONG);
    }
}

我能否知道这段代码的问题是什么,因为我无法弄清楚为什么没有调用onReceive()。

答案

尝试在Manifest中声明你的BroadcastReceiver

<receiver
        android:name=".SmsReceiver"
        android:exported="true"
        android:permission="android.permission.BROADCAST_SMS">

        <intent-filter android:priority="2332412">
            <action android:name="android.provider.Telephony.SMS_RECEIVED" />
        </intent-filter>

    </receiver>

和你的BroadCast接收器

public class SmsReceiver extends BroadcastReceiver {

private static final String TAG = SmsReceiver.class.getSimpleName();

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

    Log.e(TAG, "Checking Sms");
    Bundle bundle = intent.getExtras();
    try{
        if(bundle != null){
            Object[] pdusObj = (Object[]) bundle.get("pdus");
            for (Object aPdusObj : pdusObj) {
                SmsMessage currentMessage = SmsMessage.createFromPdu((byte[]) aPdusObj);
                String senderAddress = currentMessage.getDisplayOriginatingAddress();
                String message = currentMessage.getDisplayMessageBody();

                Log.e(TAG, "Received SMS: " + message + ", Sender: " + senderAddress);

                if (!senderAddress.toLowerCase().contains(GlobalFunctions.SMS_ORIGIN.toLowerCase())) {
                    return;
                }

                // verification code from sms
                String verificationCode = getVerificationCode(message);

                Log.e(TAG, "OTP received: " + verificationCode);

                if(AppController.isActivityVisible()) {
                    Intent smsService = new Intent(context, SmsService.class);
                    smsService.putExtra("otp", verificationCode);
                    context.startService(smsService);
                }
            }
        }
    } catch (Exception e){
        Log.e(TAG, "Exception");
        e.printStackTrace();
    }

}

}

注意:不要复制整个代码,它包含我声明的变量。只需按照代码编写,根据您的需要编写自己的代码

另一答案

在API 23及更高版本中,您还应获得在运行时接收SMS的权限。看看here

以上是关于传入的短信不会触发onReceive()的主要内容,如果未能解决你的问题,请参考以下文章

发布值更改后不会触发 onReceive

片段中不调用onReceive()方法

片段创建的 Intent 不会触发 onNewIntent

没有 requestLocationUpdates 不会触发 Android 地理围栏

显示有关短信接收的通知

Android:发送数据短信的问题