收到新短信时短信接收应用程序崩溃-Android

收到新短信时短信接收应用程序崩溃-Android,android,listview,android-cursor,smsmanager,Android,Listview,Android Cursor,Smsmanager,我建立了一个短信发送/接收活动,一切正常。接收部分只是将我的所有文本从Android消息应用程序加载到列表视图中。这也行得通。问题是当一条新的短信出现时,它会立即崩溃。即使我在另一个应用程序中或在主屏幕上,我也会弹出一个弹出窗口,说我的应用程序崩溃了,并在每次收到新消息时不断重新崩溃。为什么它会崩溃?我该如何修复它?包含消息的列表视图应在收到新消息时更新。我一起修补了这段代码,所以我可能遗漏了什么。另外,只需关注SMSReceiver类(在SMSListFragment.java中)和refre

我建立了一个短信发送/接收活动,一切正常。接收部分只是将我的所有文本从Android消息应用程序加载到
列表视图中。这也行得通。问题是当一条新的短信出现时,它会立即崩溃。即使我在另一个应用程序中或在主屏幕上,我也会弹出一个弹出窗口,说我的应用程序崩溃了,并在每次收到新消息时不断重新崩溃。为什么它会崩溃?我该如何修复它?包含消息的
列表视图
应在收到新消息时更新。我一起修补了这段代码,所以我可能遗漏了什么。另外,只需关注
SMSReceiver
类(在
SMSListFragment.java
中)和
refreshsinbox()
(在
smsmsmsmain.java
中),因为这些地方是加载到我的ListView中的地方。另外,
updateList()
会更新整个过程,但前提是“我的收件箱”中已有邮件。如果更新可以实时更新就好了。可能吗?提前谢谢

在我的清单中,以下是我的相关权限:

<uses-permission android:name="android.permission.SEND_SMS" />
<uses-permission android:name="android.permission.WRITE_SMS" />
<uses-permission android:name="android.permission.READ_SMS" />
<uses-permission android:name="android.permission.RECEIVE_SMS" />

<receiver android:name=".SMSReceiver"
          android:exported="true"> 
      <intent-filter android:priority="999"> 
          <action android:name="android.provider.Telephony.SMS_RECEIVED" /> 
      </intent-filter> 
</receiver>

当您在清单中声明接收人时:

<receiver android:name=".SMSReceiver"
      android:exported="true"> 
  <intent-filter android:priority="999"> 
      <action android:name="android.provider.Telephony.SMS_RECEIVED" /> 
  </intent-filter> 
</receiver>
请注意,此路径与您在
SMSListFragment
中定义的类
SMSReceiver
的路径不匹配,这是logcat错误指示的


您可能应该在清单中使用
android:name=“.sms.SMSListFragment.SMSReceiver”
SMSReceiver
嵌套类也可能需要声明为静态才能以这种方式访问。

感谢stkent,我不知道需要这样做。虽然我做了那个改变,它仍然给我那个错误,用新的名字。我也做了
SMSReceiver
静态的<代码>java.lang.RuntimeException:无法实例化receiver org.azurespot.practiceapp.sms.SMSListFragment.SMSReceiver:java.lang.ClassNotFoundException:找不到类“org.azurespot.practiceapp.sms.SMSListFragment.SMSReceiver”…
这很奇怪,因为现在看来,
org.azurespot.practiceapp.sms.SMSListFragment.SMSReceiver
是正确的路径。您的
SMSListFragment
仍在
sms
包中,对吗?仔细想想,我的刷新代码在
smsmsmain
。。。虽然列表确实刷新得很好,但它只是无法处理的实时刷新,然后崩溃。我不知道它们是否连接,但是清单中没有
smsmsmain
,虽然它不是接收者,所以可能不需要。是的,
SMSListFragment.java
.sms
包中/<代码>SMSMain应在清单中声明为活动。尽管如此,logcat仍然显示ClassNotFoundException,因此问题可能在于
SMSReceiver
。恐怕我脑子里没有别的想法。
package org.azurespot.practiceapp.sms;

import org.azurespot.practiceapp.R;

import android.app.ListFragment;
import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import android.database.Cursor;
import android.net.Uri;
import android.os.Bundle;
import android.provider.ContactsContract;
import android.provider.ContactsContract.PhoneLookup;
import android.telephony.SmsMessage;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.Toast;

public class SMSListFragment extends ListFragment{

    public static View viewList;

    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container,
      Bundle savedInstanceState) {

      // Defines the XML file for the fragment
      viewList = inflater.inflate(R.layout.sms_messages_fragment, 
                                                        container, false);

      return viewList;
    }

    public class SMSReceiver extends BroadcastReceiver{

        @Override
        public void onReceive(Context context, Intent intent) {

            //---get the SMS message passed in---
            Bundle bundle = intent.getExtras();        
            SmsMessage[] messages = null;
            String msgString = ""; 

            if (bundle != null)
            {
                //---retrieve the SMS message received---
                Object[] pdus = (Object[]) bundle.get("pdus");
                messages = new SmsMessage[pdus.length];            
                for (int i = 0; i < messages.length; i++){
                    messages[i] = SmsMessage.createFromPdu((byte[])pdus[i]);                
                    msgString += "SMS From: " + messages[i].getOriginatingAddress();                     
                    msgString += " :";
                    msgString += messages[i].getMessageBody().toString();
                    msgString += "\n"; 



                }

                //---display the new SMS message---
                SMSMain smsMain = SMSMain.instance();
                smsMain.updateList(msgString);
            }
        }

    }

}
<receiver android:name=".SMSReceiver"
      android:exported="true"> 
  <intent-filter android:priority="999"> 
      <action android:name="android.provider.Telephony.SMS_RECEIVED" /> 
  </intent-filter> 
</receiver>
<receiver android:name="org.azurespot.practiceapp.SMSReceiver"
      android:exported="true"> 
  <intent-filter android:priority="999"> 
      <action android:name="android.provider.Telephony.SMS_RECEIVED" /> 
  </intent-filter> 
</receiver>