【问题标题】:App Crashing by NullPointerException with ContentResolver retrieving SMS应用程序崩溃由 NullPointerException 与 ContentResolver 检索 SMS
【发布时间】:2016-02-08 19:57:28
【问题描述】:

当我尝试从另一个类 (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)。因此,发送者中的 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 时,应用程序启动正常。

【问题讨论】:

    标签: java android listview arraylist sms


    【解决方案1】:

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

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

    【讨论】:

    • 好的,谢谢,我将 getAllSmsFromProvider 更改为静态。
    • 现在,我只是在 getSender() 中使用它吗? ArrayList> messages = MainActivity.getAllSmsFromProvider(Senders);
    • @JesseZhang:Senders 是一个类。您不能将类的名称传递给方法。除此之外,你的代码对我来说毫无意义,所以我不能真正建议你应该调用什么。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-05-24
    • 2019-03-11
    • 2023-04-08
    • 2015-01-21
    • 2016-02-11
    • 1970-01-01
    相关资源
    最近更新 更多