Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/207.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 自定义短信接收器在第一次收到短信时崩溃[Android]_Java_Android_Android Intent_Android Activity_Sms - Fatal编程技术网

Java 自定义短信接收器在第一次收到短信时崩溃[Android]

Java 自定义短信接收器在第一次收到短信时崩溃[Android],java,android,android-intent,android-activity,sms,Java,Android,Android Intent,Android Activity,Sms,我写了一个android应用程序,可以接收短信。应用程序正在运行。它可以接收短信,但每次应用程序刚安装完毕。每次我从emulator向应用程序发送短信(无需手动打开),它就会崩溃或强制关闭,但如果我手动打开它,它可以接收短信而不会出现问题 这是我的代码,如果应用程序收到短信,它将执行此代码 public void onReceive(Context context, Intent intent) { Bundle bundle = intent.getExtras(); SmsM

我写了一个android应用程序,可以接收短信。应用程序正在运行。它可以接收短信,但每次应用程序刚安装完毕。每次我从emulator向应用程序发送短信(无需手动打开),它就会崩溃或强制关闭,但如果我手动打开它,它可以接收短信而不会出现问题

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

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);
        }

       }

}
和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) {
}   
公共类CustomAdapter扩展BaseAdapter实现OnClickListener{
私人活动;
私有ArrayList数据=null;
专用静态充气机=空;
数据持有者tempValues=null;
int i=0;
公共CustomAdapterr(活动a,ArrayList d){
活动=a;
数据=d;
充气器=(LayoutInflater)activity.getSystemService(Context.LAYOUT\u充气器\u SERVICE);
}
public int getCount(){
返回data.size();
}
公共对象getItem(int位置){
返回位置;
}
公共长getItemId(int位置){
返回位置;
}
公共静态类视图持有者{
公共文本视图cp;
公共文本视图混乱;
公共文本视图ts;
}
公共视图getView(int位置、视图转换视图、视图组父视图){
视图vi=转换视图;
视窗座;
if(convertView==null){
vi=充气机充气(R.layout.list_行,空);
holder=新的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=(ViewHolder)vi.getTag();
}

如果(Data .siz())p> <代码> nulpPoExtExealOuts<代码>是在适配器的构造函数中生成的,在您的活动中,我不知道什么是“代码> CuxListVIEW < /代码>,但它是NULL,您应该考虑检查一下,首先解决这个问题:
adapter=新的CustomAdapter(customListView,customListViewValues);
为此:

adapter=new CustomAdapterr(这是customListViewValues);


在您的
populateView
方法中。

您能提供堆栈跟踪、位置吗?好的,先生,我将首先重新启动我的emulator@EuryPérezBeltréI包括堆栈跟踪请添加CustomAdapter.java行26@EuryPérezBeltréinflater=(LayoutInflater)activity.getSystemService(Context.LAYOUT_inflater_SERVICE);将其更改为“this”后它有一个错误“不能在静态上下文中使用它”好吧,我明白了,问题是在活动中使用静态方法不是一个好的实践,从外部调用它们更糟糕(例如,服务或接收方)要与您的活动进行通信,请考虑使用LoopBeldCaseMealm。检查这个例子:这也是有用的:这是更像Android的方式。您应该从您的代码中删除静态标志> PualTaveVIEWS/<代码>方法,并使用LoalBaskCaseMead与您的活动进行通信。好的,先生。我会试试。谢谢。nfo对您很有帮助,请接受答案,我会相应更新:)
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();
}
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) {
}