1

The app is crashing when I try to call getAllSmsFromProvider method (in MainActivity) from another class (Senders.java).

Here's the method:

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;
}

Here's the Senders.java class calling this method:

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 returns messages, an arraylist of arraylists. each arraylist within the arraylist of messages contains two important things, the sender's number and the most recent text sent/received (indexed at 0, and 1, respectively). So the for loop within senders is trying to add that to an arraylist that will be used to populate a list adapter.

Here's the error i'm receiving after crash:

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)

As you can see, there's something wrong with my instantiation of mainActivity and use of getallsmsfromprovider within senders.java, as when I comment out calling getallsmsfromprovider from Senders.java, the app launches fine.

Jesse Zhang
  • 71
  • 1
  • 10

1 Answers1

1

Never create an activity instance yourself. Your MainActivity instance is not properly initialized by the system and cannot be used for much of anything.

Delete MainActivity mainActivity = new MainActivity(); from getSender(). Have getAllSmsFromProvider() take a Context as a parameter, so you can call getContentResolver() on that Context. Or, have getAllSmsFromProvider() take a ContentResolver as a parameter.

CommonsWare
  • 986,068
  • 189
  • 2,389
  • 2,491
  • Okay thanks, and I changed getAllSmsFromProvider to static. – Jesse Zhang Nov 07 '15 at 21:05
  • Now, do I just use this in getSender()? ArrayList> messages = MainActivity.getAllSmsFromProvider(Senders); – Jesse Zhang Nov 07 '15 at 21:06
  • @JesseZhang: `Senders` is a class. You cannot pass the name of a class into a method. Beyond that, your code makes little sense to me, so I cannot really advise you on what should be calling what. – CommonsWare Nov 07 '15 at 21:18