应用程序崩溃NullPointerException与ContentResolver检索SMS

时间:2015-11-07 20:52:40

标签: 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返回消息,arraylists的arraylist。消息的arraylist中的每个arraylist包含两个重要的事情,发送者的号码和发送/接收的最新文本(分别为0和1索引)。因此,发件人中的for循环试图将其添加到将用于填充列表适配器的arraylist。

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

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)

正如您所看到的,我在mainders中实例化并在senders.java中使用getallsmsfromprovider时出现问题,因为当我注释掉从Senders.java调用getallsmsfromprovider时,应用程序启动正常。

1 个答案:

答案 0 :(得分:1)

永远不要自己创建活动实例。您的MainActivity实例未被系统正确初始化,并且无法用于任何内容。

MainActivity mainActivity = new MainActivity();删除getSender()。请getAllSmsFromProvider()Context作为参数,以便您可以在getContentResolver()上致电Context。或者,让getAllSmsFromProvider()ContentResolver作为参数。