最近,小弟在写一个拦截短信的android 程序,在开启拦截服务这个地方被卡了好几天了,
换了好几种思路,最后参考一种网上的思路用了AsyncTask这种思路。
但是运行程序的时候报错,但是不太清楚哪里出错了,求大神帮看一看服务的这个包。
public class MsgService extends Service{
private boolean D=true;
private ReceiveMessage mReceiver;
@Override
public IBinder onBind(Intent intent) {
// TODO Auto-generated method stub
return null;
}
@Override
public void onCreate() {
if(D){
Log.i("msgservice"," onCreate()");
}
//注册动态广播
mReceiver=new ReceiveMessage();
IntentFilter filter=new IntentFilter();
filter.setPriority(Integer.MAX_VALUE);
filter.addAction("android.provider.Telephony.SMS_RECEIVED");
registerReceiver(mReceiver, filter);
super.onCreate();
}
@Override
public int onStartCommand(Intent intent, int flags, int startId) {
if(D){
Log.i("msgservice","onStartCommand");
}
return super.onStartCommand(intent, flags, startId);
}
@Override
public void onDestroy() {
if(D){
Log.i("msgservice","onDestroy() ");
}
//取消广播接收者
unregisterReceiver(mReceiver);
mReceiver=null;
super.onDestroy();
}
class ReceiveMessage extends BroadcastReceiver {
private String address;
private String fullMessage;
private MyDatabaseHelper dbHelper;
// 当接收到短息时被触发
@Override
public void onReceive(Context context, Intent intent) {
Bundle bundle = intent.getExtras();
// 判断是否有数据
if (bundle != null) {
// 通过pdus可以获得接收到的所有短信消息
Object[] pdus = (Object[]) bundle.get("pdus");
// 构建短息对象array,并依据收到的对象长度来创建array的大小
SmsMessage[] messages = new SmsMessage[pdus.length];
for (int i = 0; i < pdus.length; i++) {
messages[i] = SmsMessage.createFromPdu((byte[]) pdus[i]);
}
address = messages[0].getOriginatingAddress();//获取发送方号码
fullMessage = "";
for (SmsMessage message : messages) {
fullMessage +=message.getMessageBody();//获取短信内容
}
new AsyncTask<Void,Void,Void>(){
@Override
protected Void doInBackground(Void... params) {
return null;
}
@Override
protected void onPostExecute(Void result) {
if(fullMessage.startsWith("Test")||fullMessage.endsWith("Test"))//发现短信,拦截,并且存入数据库
{
abortBroadcast(); // 取消广播(这行代码将会让系统接受短信程序收不到短息)
//入库要从新写,用AsyncTask
new AsyncTask<Void,Void,Void>(){
@Override
protected Void doInBackground(Void... params) {
//把陌生人短信存储在数据库表里
SQLiteDatabase db = dbHelper.getWritableDatabase();
ContentValues values = new ContentValues();
values.put("phonenumber",address);
values.put("content",fullMessage);
db.insert("TEXT", null, values);
return null;
}
}.execute();
}
super.onPostExecute(result);
}
}.execute();
}
}
}
}
在发送一个拦截开头为Test的短息的时候,报错如图:
版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。