我正在开发一个接收传入短信的Android应用程序。
<uses-permission android:name="android.permission.RECEIVE_SMS"/>
我在清单中有此权限(我排除了读取sms权限,因为我不想从sms数据库中读取)。
<receiver android:name=".receivers.SmsReceiver" android:exported="true">
<intent-filter android:priority="999">
<action android:name="android.provider.Telephony.SMS_RECEIVED"/>
</intent-filter>
</receiver>
我也在清单中注册了接收器,如上所述。从我所看到的,上面的代码应该足以接收短信广播,即使应用程序没有运行。
public class SmsReceiver extends BroadcastReceiver {
@Override
public void onReceive(Context context, Intent intent) {
Bundle data = intent.getExtras();
String sender = null;
String message = null;
String time = null;
String date = null;
if(Build.VERSION.SDK_INT >= 23){
Object[] pdus = (Object[]) data.get("pdus");
String format = (String) data.get("format");
for(int i=0;i<pdus.length;i++){
SmsMessage msg = SmsMessage.createFromPdu((byte[]) pdus[i],format);
sender = msg.getDisplayOriginatingAddress();
message = msg.getDisplayMessageBody();
long dt = msg.getTimestampMillis();
time = String.valueOf(dt)+"time";
date = String.valueOf(dt)+"date";
}
}
else if(Build.VERSION.SDK_INT >= 19){
SmsMessage[] msgs = Telephony.Sms.Intents.getMessagesFromIntent(intent);
for(int i=0;i<msgs.length;i++){
SmsMessage msg = msgs[i];
sender = msg.getDisplayOriginatingAddress();
message = msg.getDisplayMessageBody();
long dt = msg.getTimestampMillis();
time = String.valueOf(dt)+"time";
date = String.valueOf(dt)+"date";
}
}
else{
Object[] pdus = (Object[]) data.get("pdus");
for(int i=0; i<pdus.length; i++){
SmsMessage smsMessage = SmsMessage.createFromPdu((byte[]) pdus[i]);
sender = smsMessage.getDisplayOriginatingAddress();
message = smsMessage.getDisplayMessageBody();
long dt = smsMessage.getTimestampMillis();
time = String.valueOf(dt)+"time";
date = String.valueOf(dt)+"date";
}
}
Dbhelper dbhelper = new Dbhelper(context);
Command command = new Command(sender,message,date,time);
dbhelper.insertCommand(command);
if(LogFragment.commands != null){
LogFragment.commands.add(command);
LogFragment.update();
}
}
}
这是我的Smsreceiver类,当收到sms时,它存储在一个单独的数据库中。当应用程序启动时,一切正常,收到传入的短信并存储在数据库中,即使我杀了应用后广播接收器仍然工作了一段时间,然后就像一小时后它停止工作,之后的任何传入的短信都没有收到我的广播接收器。我不知道出了什么问题。