靠脖子提身高 2016-02-17 14:56 采纳率: 60%
浏览 1413
已采纳

Android 关于服务里面的AsyncTask方法问题

最近,小弟在写一个拦截短信的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的短息的时候,报错如图:

图片说明

图片说明

  • 写回答

4条回答 默认 最新

  • zrf1335348191 博客专家认证 2016-02-17 15:38
    关注

    日志里caused by原因是空指针,程序97行,空指针好解决,断点看看怎么空了

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
查看更多回答(3条)

报告相同问题?

悬赏问题

  • ¥15 matlab数字图像处理频率域滤波
  • ¥15 在abaqus做了二维正交切削模型,给刀具添加了超声振动条件后输出切削力为什么比普通切削增大这么多
  • ¥15 ELGamal和paillier计算效率谁快?
  • ¥15 file converter 转换格式失败 报错 Error marking filters as finished,如何解决?
  • ¥15 ubuntu系统下挂载磁盘上执行./提示权限不够
  • ¥15 Arcgis相交分析无法绘制一个或多个图形
  • ¥15 关于#r语言#的问题:差异分析前数据准备,报错Error in data[, sampleName1] : subscript out of bounds请问怎么解决呀以下是全部代码:
  • ¥15 seatunnel-web使用SQL组件时候后台报错,无法找到表格
  • ¥15 fpga自动售货机数码管(相关搜索:数字时钟)
  • ¥15 用前端向数据库插入数据,通过debug发现数据能走到后端,但是放行之后就会提示错误