【问题标题】:Custom SMS Receiver Crashes on First Received SMS [Android] [duplicate]自定义短信接收器在首次收到短信时崩溃 [Android] [重复]
【发布时间】:2016-03-05 03:42:00
【问题描述】:

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

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

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.access$1500(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) {
}   

}

【问题讨论】:

  • 你能提供堆栈跟踪吗?
  • 好的先生,我先重启我的模拟器
  • @EuryPérezBeltré 我包含了堆栈跟踪
  • 请添加 CustomAdapter.java 第 26 行
  • @EuryPérezBeltré inflater = ( LayoutInflater )activity.getSystemService(Context.LAYOUT_INFLATER_SERVICE);

标签: java android android-intent android-activity sms


【解决方案1】:

NullPointerException 是在适配器的构造函数中生成的,我不知道您的活动中的customListView 是什么,但它是空的,您应该考虑检查一下,最初要解决此问题,请更改此:

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

adapter = new CustomAdapterr(this, customListViewValues);

在您的 populateView 方法中。

【讨论】:

  • 将其更改为 "this" 后出现错误 "cannot use this on static context"
  • 好的,我明白了,在 Activity 中使用静态方法并不是一个好习惯,从外部调用它们(例如服务或接收器,例如您的情况)更糟糕。要与您的活动进行通信,请考虑使用 LocalBroadcastManager。检查此示例:gist.github.com/Antarix/8131277。这个也很有用:stackoverflow.com/questions/8802157/… 这是更类似于 Android 的方式。
  • 您应该从 populateViews 方法中删除静态标志,并使用 LocalBroadcastManager 与您的活动进行通信。
  • 好的,先生。我会试试看。谢谢你
  • 如果信息对你有帮助,请采纳答案,我会相应更新:)
猜你喜欢
  • 1970-01-01
  • 2011-05-06
  • 1970-01-01
  • 2011-12-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多