传入的短信不会触发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()的主要内容,如果未能解决你的问题,请参考以下文章