java - 使用 ContentResolver 检索 SMS 的 NullPointerException 导致应用程序崩溃

标签 java android listview arraylist sms

当我尝试从另一个类 (Senders.java) 调用 getAllSmsFromProvider 方法(在 MainActivity 中)时,应用程序崩溃了。

方法如下:

public ArrayList<ArrayList<String>> getAllSmsFromProvider() {
    List<String> lstSenders = new ArrayList<>();
    ContentResolver cr = getContentResolver();
    ArrayList<ArrayList<String>> messages = new ArrayList<>();

    Cursor c = cr.query(Telephony.Sms.CONTENT_URI, // Official CONTENT_URI from docs
            new String[]{Telephony.TextBasedSmsColumns.ADDRESS, Telephony.TextBasedSmsColumns.BODY}, // Select body text
            null,
            null,
            Telephony.Sms.DEFAULT_SORT_ORDER); // Default sort order

    int totalSMS = c.getCount();

    if (c.moveToFirst()) {
        for (int i = 0; i < totalSMS; i++) {
            String number = c.getString(0);
            number = number.substring(number.length()-10,number.length());
            if (lstSenders.contains(number)){
                c.moveToNext();
            } else {
                lstSenders.add(number);
                ArrayList<String> convo = new ArrayList<>();
                convo.add(number);
                messages.add(convo);
                c.moveToNext();
            }
        } }else {
        throw new RuntimeException("You have no SMS in Inbox");
    }
    c.moveToFirst();
    if (c.moveToFirst()) {
        String number = c.getString(0);
        number = number.substring(number.length()-10,number.length());
        int index = lstSenders.indexOf(number);
        messages.get(index).add(c.getString(1));
        c.moveToNext();
    } else {

    }

    return messages;
}

这是调用此方法的 Senders.java 类:

public class Senders {
public String senderNumber;
public String mostRecentSMS;

public Senders(String number, String mostRecentSMS){
    this.senderNumber = number;
    this.mostRecentSMS = mostRecentSMS;
}
public static ArrayList<Senders> getSender() {
    ArrayList<Senders> sender = new ArrayList<>();

    MainActivity mainActivity = new MainActivity();
    ArrayList<ArrayList<String>> messages = mainActivity.getAllSmsFromProvider();

    for (int i = 0; i < messages.size(); i ++){
        sender.add(new Senders(messages.get(i).get(0), messages.get(i).get(1)));
    }

getallsmsfromprovider 返回消息,一个数组列表的数组列表。消息数组列表中的每个数组列表包含两个重要的内容,发件人的号码和最近发送/接收的文本(索引分别为 0 和 1)。因此 senders 中的 for 循环试图将其添加到将用于填充列表适配器的数组列表中。

这是我在崩溃后收到的错误:

Caused by: java.lang.NullPointerException: Attempt to invoke virtual method 'android.content.ContentResolver android.content.Context.getContentResolver()' on a null object reference
11-07 12:43:29.454 10266-10266/com.jesse.android.textingapp E/AndroidRuntime:     at android.content.ContextWrapper.getContentResolver(ContextWrapper.java:97)
11-07 12:43:29.454 10266-10266/com.jesse.android.textingapp E/AndroidRuntime:     at com.jesse.android.textingapp.MainActivity.getAllSmsFromProvider(MainActivity.java:84)
11-07 12:43:29.454 10266-10266/com.jesse.android.textingapp E/AndroidRuntime:     at com.jesse.android.textingapp.Senders.getSender(Senders.java:22)

11-07 12:43:29.454 10266-10266/com.jesse.android.textingapp E/AndroidRuntime:     at com.jesse.android.textingapp.MainActivity.onCreate(MainActivity.java:32)

如您所见,我在 senders.java 中对 mainActivity 的实例化和 getallsmsfromprovider 的使用存在一些问题,因为当我注释掉从 Senders.java 调用 getallsmsfromprovider 时,应用程序启动正常。

最佳答案

永远不要自己创建 Activity 实例。您的 MainActivity 实例没有被系统正确初始化,不能用于很多事情。

getSender() 中删除 MainActivity mainActivity = new MainActivity();。让 getAllSmsFromProvider()Context 作为参数,这样您就可以在该 Context 上调用 getContentResolver()。或者,让 getAllSmsFromProvider()ContentResolver 作为参数。

关于java - 使用 ContentResolver 检索 SMS 的 NullPointerException 导致应用程序崩溃,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33587655/

相关文章:

java - SimpleDateFormat.getTimeInstance 忽略 24 小时格式

android - 为什么我的 ListView 在 android 中不滚动?

android - 重写 Android ArrayAdapter

android - ViewPager 中的 Fragment 失去了它的 View

android - Chrome/Android Jingle-SDP ICE 连接失败

Java 按字母顺序对字符串进行排序并保持 ASCII 顺序

java - 在android中裁剪后保存图像

java - 在 BorderLayout 的 JPanel east 上显示图形三角形的问题

android - 更改网络时接收 NETWORK_STATE_CHANGED_ACTION 已连接

java - 如何在Android中的上一个按钮上设置选中的单选按钮?