Java 自定义短信接收器在第一次收到短信时崩溃[Android]
我写了一个android应用程序,可以接收短信。应用程序正在运行。它可以接收短信,但每次应用程序刚安装完毕。每次我从emulator向应用程序发送短信(无需手动打开),它就会崩溃或强制关闭,但如果我手动打开它,它可以接收短信而不会出现问题 这是我的代码,如果应用程序收到短信,它将执行此代码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
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) {
}