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