自定义 SMS 接收器在首次收到 SMS 时崩溃 [Android]

Custom SMS Receiver Crashes on First Received SMS [Android]

我写了一个 android 可以接收短信的应用程序。该应用程序正在运行。它可以接收短信,但每次应用程序刚安装时。每次我从模拟器向应用程序发送短信(没有手动打开它)它崩溃或强制关闭但是如果我手动打开它它可以毫无问题地接收短信

这是我的代码,如果应用程序收到短信,它将执行此代码

public void onReceive(Context context, Intent intent) {
    Bundle bundle = intent.getExtras();
    SmsMessage [] msgs = null;
    String messageReceived = "";
    String senderPhoneNumber = null;
    long senderTimestamp = 0;
    String strTimestamp = null;

    if (bundle != null) {

        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]);                
            messageReceived += msgs[i].getMessageBody().toString();
            messageReceived += "\n";
        }

        senderPhoneNumber = msgs[0].getOriginatingAddress ();
        senderTimestamp = msgs[0].getTimestampMillis() / 1000L;
        strTimestamp = senderTimestamp + "";

        if(MainActivity.active){
            MainActivity.populateView(senderPhoneNumber, messageReceived, strTimestamp);
        } else {
            Intent i = new Intent(context,MainActivity.class);
            i.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
            MainActivity.populateView(senderPhoneNumber, messageReceived, strTimestamp);
            context.startActivity(i);
        }

       }

}

请有人帮我解决这个问题。我想在不手动打开的情况下接收短信。

编辑 这是堆栈跟踪

03-05 11:47:47.208: E/Trace(1512): error opening trace file: No such file or directory (2)
03-05 11:47:47.368: D/AndroidRuntime(1512): Shutting down VM
03-05 11:47:47.368: W/dalvikvm(1512): threadid=1: thread exiting with uncaught exception (group=0xb4e7f288)
03-05 11:47:47.430: E/AndroidRuntime(1512): FATAL EXCEPTION: main
03-05 11:47:47.430: E/AndroidRuntime(1512): java.lang.RuntimeException: Unable to start receiver com.amzngscrum.alpha2.SMSReceiver: java.lang.NullPointerException
03-05 11:47:47.430: E/AndroidRuntime(1512):     at android.app.ActivityThread.handleReceiver(ActivityThread.java:2236)
03-05 11:47:47.430: E/AndroidRuntime(1512):     at android.app.ActivityThread.access00(ActivityThread.java:130)
03-05 11:47:47.430: E/AndroidRuntime(1512):     at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1271)
03-05 11:47:47.430: E/AndroidRuntime(1512):     at android.os.Handler.dispatchMessage(Handler.java:99)
03-05 11:47:47.430: E/AndroidRuntime(1512):     at android.os.Looper.loop(Looper.java:137)
03-05 11:47:47.430: E/AndroidRuntime(1512):     at android.app.ActivityThread.main(ActivityThread.java:4745)
03-05 11:47:47.430: E/AndroidRuntime(1512):     at java.lang.reflect.Method.invokeNative(Native Method)
03-05 11:47:47.430: E/AndroidRuntime(1512):     at java.lang.reflect.Method.invoke(Method.java:511)
03-05 11:47:47.430: E/AndroidRuntime(1512):     at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:786)
03-05 11:47:47.430: E/AndroidRuntime(1512):     at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:553)
03-05 11:47:47.430: E/AndroidRuntime(1512):     at dalvik.system.NativeStart.main(Native Method)
03-05 11:47:47.430: E/AndroidRuntime(1512): Caused by: java.lang.NullPointerException
03-05 11:47:47.430: E/AndroidRuntime(1512):     at com.amzngscrum.alpha2.CustomAdapterr.<init>(CustomAdapterr.java:26)
03-05 11:47:47.430: E/AndroidRuntime(1512):     at com.amzngscrum.alpha2.MainActivity.populateView(MainActivity.java:134)
03-05 11:47:47.430: E/AndroidRuntime(1512):     at com.amzngscrum.alpha2.SMSReceiver.onReceive(SMSReceiver.java:45)
03-05 11:47:47.430: E/AndroidRuntime(1512):     at android.app.ActivityThread.handleReceiver(ActivityThread.java:2229)
03-05 11:47:47.430: E/AndroidRuntime(1512):     ... 10 more

编辑 2 这是 MainActivity.class

中的 popuateview
public static void populateView(String sender, String message, String timestamp) {


    if(sender == null || message == null || timestamp == null){
    } else {
        final DataHolder data = new DataHolder();
        data.setSenderCPNumber(sender);
        data.setSenderMessage(message);
        data.setSenderTimestamp(timestamp);
        customListViewValues.add(data);
    }

    adapter = new CustomAdapterr( customListView, customListViewValues);
    lv.setAdapter(adapter);
    adapter.notifyDataSetChanged();
    cnt.setText("On Queue: " + lv.getAdapter().getCount());
    start();
}

和CustomAdapterr.class

的完整代码
public class CustomAdapterr extends BaseAdapter implements OnClickListener {

private Activity activity;
private ArrayList data = null;
private static LayoutInflater inflater = null;
DataHolder tempValues = null;
int i = 0;

public CustomAdapterr(Activity a, ArrayList d) {
     activity = a;
     data = d;
     inflater = ( LayoutInflater )activity.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
}

public int getCount() {
    return data.size();
}

public Object getItem(int position) {
    return position;
}

public long getItemId(int position) {
    return position;
}

public static class ViewHolder{
    public TextView cp;
    public TextView mess;
    public TextView ts;
}

public View getView(int position, View convertView, ViewGroup parent) {

    View vi = convertView;
    ViewHolder holder;

    if(convertView == null){

        vi = inflater.inflate(R.layout.list_row, null);

        holder = new ViewHolder();
        holder.cp = (TextView) vi.findViewById(R.id.cpnumber);
        holder.mess = (TextView) vi.findViewById(R.id.messages);
        holder.ts = (TextView) vi.findViewById(R.id.timestamp);

        vi.setTag(holder);
    } else {
        holder = (ViewHolder) vi.getTag();
    }

    if(data.size()<=0) {
        //no data here
    }
    else {
        tempValues = null;
        tempValues = (DataHolder) data.get(position);

        holder.cp.setText(tempValues.getSenderCPNumber());
        holder.mess.setText(tempValues.getSenderMessage());
        holder.ts.setText(tempValues.getSenderTimestamp());
        vi.setOnClickListener(new OnItemClickListener(position));
    }
    return vi;
}

private class OnItemClickListener implements OnClickListener{

    private int mPosition;

    OnItemClickListener(int position){
         mPosition = position;
    }

    @Override
    public void onClick(View arg0) {
      MainActivity mainClick = (MainActivity) activity;
      mainClick.onItemClick(mPosition);
    }               
}

@Override
public void onClick(View v) {
}   

}

NullPointerException 是在适配器的构造函数中生成的,我不知道你的 activity 中的 customListView 是什么,但它是空的,你应该考虑检查一下,最初解决这个问题改变这个:

adapter = new CustomAdapterr(customListView, customListViewValues); 为此:

adapter = new CustomAdapterr(this, customListViewValues);

在你的populateView方法中。