-2

I am currently trying to develop a sms application, it runs and it was able to retrieve messages, but once you close the application and restart it, it force closes, it says that there is a NullPointerException. Here is the error log. The list might be the reason but I dont know why, StackOverflow wont allow me to post this without adding additional info which i dont really know what to add.

08-08 16:08:17.317 9977-9977/backdev.messages E/AndroidRuntime: FATAL EXCEPTION: main
                                                            Process: backdev.messages, PID: 9977
                                                            java.lang.RuntimeException: Unable to start activity ComponentInfo{backdev.messages/backdev.messages.MessageActivity}: java.lang.NullPointerException: Attempt to invoke interface method 'boolean java.util.List.add(java.lang.Object)' on a null object reference
                                                                at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2434)
                                                                at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2494)
                                                                at android.app.ActivityThread.access$900(ActivityThread.java:153)
                                                                at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1347)
                                                                at android.os.Handler.dispatchMessage(Handler.java:102)
                                                                at android.os.Looper.loop(Looper.java:148)
                                                                at android.app.ActivityThread.main(ActivityThread.java:5451)
                                                                at java.lang.reflect.Method.invoke(Native Method)
                                                                at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:726)
                                                                at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:616)
                                                             Caused by: java.lang.NullPointerException: Attempt to invoke interface method 'boolean java.util.List.add(java.lang.Object)' on a null object reference
                                                                at backdev.messages.MessageActivity.refreshSMSInbox(MessageActivity.java:136)
                                                                at backdev.messages.MessageActivity.getPermissionToReadSMS(MessageActivity.java:118)
                                                                at backdev.messages.MessageActivity.onCreate(MessageActivity.java:78)
                                                                at android.app.Activity.performCreate(Activity.java:6323)
                                                                at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1108)
                                                                at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2387)
                                                                at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2494) 
                                                                at android.app.ActivityThread.access$900(ActivityThread.java:153) 
                                                                at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1347) 
                                                                at android.os.Handler.dispatchMessage(Handler.java:102) 
                                                                at android.os.Looper.loop(Looper.java:148) 
                                                                at android.app.ActivityThread.main(ActivityThread.java:5451) 
                                                                at java.lang.reflect.Method.invoke(Native Method) 
                                                                at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:726) 
                                                                at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:616) 

Here is my code:

private static final int READ_SMS_PERMISSIONS_REQUEST =1;
private Context mContext = MessageActivity.this;
private static final String TAG = "MessageActivity";

private List<PreviewMessage> mPreviewMessages;
private RecyclerView rvMessages;
private static MessageActivity inst;
private RecyclerView.Adapter mMessagesAdapter;
@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_message);

    rvMessages = (RecyclerView) findViewById(R.id.rvMessages);
    rvMessages.setHasFixedSize(true);
    rvMessages.setLayoutManager(new LinearLayoutManager(mContext));

    getPermissionToReadSMS();
    mPreviewMessages = new ArrayList<>();
    if (ContextCompat.checkSelfPermission(this, Manifest.permission.READ_SMS)
            != PackageManager.PERMISSION_GRANTED) {
        getPermissionToReadSMS();
    } else {
        refreshSMSInbox();
    }

}

public void getPermissionToReadSMS(){
    Log.d(TAG, "getPermissionToReadSMS: getting permission");
    if(ContextCompat.checkSelfPermission(mContext, Manifest.permission.READ_SMS)!= PackageManager.PERMISSION_GRANTED){
        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
            // Should we show an explanation?
            if (shouldShowRequestPermissionRationale(Manifest.permission.READ_SMS)){
                Log.d(TAG, "getPermissionToReadSMS: requesting Permission again");
                // Show an explanation to the user *asynchronously* -- don't block
                // this thread waiting for the user's response! After the user
                // sees the explanation, try again to request the permission.
                Toast.makeText(mContext,"Application will not work without this permission", Toast.LENGTH_SHORT).show();

                requestPermissions(new String[]{Manifest.permission.READ_SMS},READ_SMS_PERMISSIONS_REQUEST);
            }
            // No explanation needed, we can request the permission.
            //display explanation first --- not yet done
            Log.d(TAG, "getPermissionToReadSMS: requestPermission");
            requestPermissions(new String[]{Manifest.permission.READ_SMS},READ_SMS_PERMISSIONS_REQUEST);
        }
    }else{
            refreshSMSInbox();

    }

}

private void refreshSMSInbox() {
    ContentResolver contentResolver = getContentResolver();
    Cursor smsInboxCursor = contentResolver.query(Uri.parse("content://sms/inbox"),null,null,null,null);
    int indexBody = smsInboxCursor.getColumnIndex("body");
    int indexAddress = smsInboxCursor.getColumnIndex("address");
    while (smsInboxCursor.moveToNext()) {

        PreviewMessage previewMessage = new PreviewMessage(smsInboxCursor.getString(indexAddress),smsInboxCursor.getString(indexBody),  1);

        /*
        ERROR HERE
         */
        mPreviewMessages.add(previewMessage);

    }

    mMessagesAdapter = new MessagesAdapter(mPreviewMessages,mContext);

    rvMessages.setAdapter(mMessagesAdapter);
}
@Override
public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {
    super.onRequestPermissionsResult(requestCode, permissions, grantResults);
    switch (requestCode){
        case 1:
            // If request is cancelled, the result arrays are empty.
            if (grantResults.length > 0 && grantResults[0] == PackageManager.PERMISSION_GRANTED){
                //granted do things here
                //read sms
                refreshSMSInbox();

            }else {

            }
    }
}
Phantômaxx
  • 37,901
  • 21
  • 84
  • 115

2 Answers2

3

Look at the stack carefully and you will see your onCreate is calling getPermissionToReadSms which in turn is calling refreshSmsBox which is trying to add an element to the list mPreviewMessages.

You initialize this list in onCreate after calling getPermissionToReadSms. So that's why it's throwing null exeception.

Just move your mPreviewMessages initialization above getPermissionToReadSms call and it will work.

Siddharth Garg
  • 1,560
  • 14
  • 19
0

initialize your list before adding data to it. Because getPermissionToReadSMS(); calls refreshSMSInbox();` which tries to add data to your list before initializing it if OS is lower than Marshmallow

mPreviewMessages = new ArrayList<>();
getPermissionToReadSMS();
Phantômaxx
  • 37,901
  • 21
  • 84
  • 115
akshay_shahane
  • 4,423
  • 2
  • 17
  • 30