java - Why MapActivity crashes on lower API phone? -


my mapactivity crashes on low api phone. in lg g4 isn't crashing. why happening?

this code:

public class mapsactivity extends fragmentactivity implements onmapreadycallback { private static final string firebase_url="https://***.firebaseio.com/"; private firebase firebaseref; private locationmanager locationmanager; private googlemap mmap; boolean bpermissiongranted; public static final int my_permissions_request_location = 123; @override protected void oncreate(bundle savedinstancestate) {     super.oncreate(savedinstancestate);     setcontentview(r.layout.activity_maps2);     firebase.setandroidcontext(this);     firebaseref = new firebase(firebase_url);      // obtain supportmapfragment , notified when map ready used.     supportmapfragment mapfragment = (supportmapfragment) getsupportfragmentmanager()             .findfragmentbyid(r.id.map);     mapfragment.getmapasync(this);      setupmapifneeded();     mmap.setonmarkerclicklistener(new googlemap.onmarkerclicklistener() {          @override         public boolean onmarkerclick(marker marker) {             final string title = marker.gettitle().tostring();              firebaseref.addlistenerforsinglevalueevent(new valueeventlistener() {                 @override                 public void ondatachange(datasnapshot datasnapshot) {                     (datasnapshot user : datasnapshot.child("users").getchildren()) {                         if (user.child("event/event_title").exists()) {                             string event_title = user.child("event/event_title").getvalue().tostring();                             if (title.equals(event_title)) {                                  string event_date = user.child("event/event_date").getvalue().tostring();                                 string event_content = user.child("event/event_content").getvalue().tostring();                                 string age_limit = user.child("event/age_limit").getvalue().tostring();                                 string event_hour = user.child("event/event_hour").getvalue().tostring();                                 string location_left = user.child("location_left").getvalue().tostring();                                 string location_right = user.child("location_right").getvalue().tostring();                                 string event_address=user.child("event_address").getvalue().tostring();                                 string club_name=user.child("club_name").getvalue().tostring();                                 final sharedpreferences sp = getsharedpreferences("key", 0);                                 final sharedpreferences.editor sedt = sp.edit();                                 sedt.putstring("event_address",event_address);                                 sedt.putstring("event_title", event_title);                                 sedt.putstring("event_date", event_date);                                 sedt.putstring("event_content", event_content);                                 sedt.putstring("age_limit", age_limit);                                 sedt.putstring("event_hour", event_hour);                                 sedt.putstring("location_left", location_left);                                 sedt.putstring("location_right", location_right);                                 sedt.putstring("club_name",club_name);                                 sedt.commit();                              }                          }                     }                     intent intent = new intent(mapsactivity.this, eventinfo.class);                     startactivity(intent);                 }                  @override                 public void oncancelled(firebaseerror firebaseerror) {                     toast.maketext(mapsactivity.this, "error", toast.length_long).show();                 }             });      return true;         }     });  }   private void setupmapifneeded() {     if (mmap == null) {         // try obtain map supportmapfragment.         log.w("myapp", "1");         mmap = ((supportmapfragment) getsupportfragmentmanager().findfragmentbyid(r.id.map))                 .getmap();          if (mmap != null) {              log.w("myapp", "2");             cameraupdate center = cameraupdatefactory.newlatlng(new latlng(32.065483, 34.824550));             cameraupdate zoom = cameraupdatefactory.zoomto(10);             mmap.movecamera(center);             mmap.animatecamera(zoom);          }     } }   @override public void onmapready(final googlemap googlemap) {      mmap=googlemap;      if (contextcompat.checkselfpermission(this,             manifest.permission.access_fine_location)             != packagemanager.permission_granted) {      }     else     {         log.w("myapp", "3");         mmap.setmylocationenabled(true);      }      firebaseref.addlistenerforsinglevalueevent(new valueeventlistener() {         @override         public void ondatachange(datasnapshot datasnapshot) {             log.w("myapp", "4");                  (datasnapshot child : datasnapshot.child("users").getchildren()) {                     if(child.child("event/event_title").exists()) {                         if (daterelevant(child.child("event/event_date").getvalue().tostring()) == true) {                             string rightlocation = child.child("location_right").getvalue().tostring();                             string leftlocation = child.child("location_left").getvalue().tostring();                              double location_left = double.parsedouble(leftlocation);                             double location_right = double.parsedouble(rightlocation);                             string event_title = child.child("event/event_title").getvalue().tostring();                             latlng cod = new latlng(location_left, location_right);                             googlemap.addmarker(new markeroptions().position(cod).title(event_title));                           }                     }             }         }          @override         public void oncancelled(firebaseerror firebaseerror) {          }     });   }  public boolean daterelevant(string event_date) {       calendar = calendar.getinstance();     int curr_year = now.get(calendar.year);     int curr_month = now.get(calendar.month) + 1; // note: 0 based!     int curr_day = now.get(calendar.day_of_month);     string curr_year2=curr_year+"";     string [] esre = curr_year2.split("0");     int esreyear=integer.parseint(esre[1]);     int day;     int month;     int year;      if(event_date.indexof(".")!=-1) {         string[] dateparts = event_date.split("\\.");         day = integer.parseint(dateparts[0]);         month = integer.parseint(dateparts[1]);         year = integer.parseint(dateparts[2]);     }     else     {         string[] dateparts = event_date.split("/");         day = integer.parseint(dateparts[0]);         month = integer.parseint(dateparts[1]);         year = integer.parseint(dateparts[2]);     }      if(year<esreyear||(curr_year>year&&year!=16&&year!=17)) {         return false;      }     else     {         if(year==curr_year||year==esreyear)         {             if(month==curr_month)             {                 if(day>=curr_day)                 {                     return true;                 }                 else                 {                     return false;                 }             }             else             {                 if(month>curr_month)                 {                     return true;                 }                 else                 {                     return false;                 }             }         }         else         {             if(esreyear<year||curr_year<year)             {                 return true;             }             else {                 return false;             }         }     }  } } 

the error in logcat says:

fatal exception: main process: com.giladneiger.clubber, pid: 22389 java.lang.runtimeexception: unable start activity componentinfo{com.giladneiger.clubber/com.giladneiger.clubber.mapsactivity}: java.lang.nullpointerexception @ android.app.activitythread.performlaunchactivity(activitythread.java:2252)

you using onmapreadycallback setting map on oncreate. if map not ready yet receive nullpointerexception.

move initialization code onmapready method.

your code this:

@override protected void oncreate(bundle savedinstancestate) {     super.oncreate(savedinstancestate);     setcontentview(r.layout.activity_maps2);     firebase.setandroidcontext(this);     firebaseref = new firebase(firebase_url);      // obtain supportmapfragment , notified when map ready used.     supportmapfragment mapfragment = (supportmapfragment) getsupportfragmentmanager()             .findfragmentbyid(r.id.map);     mapfragment.getmapasync(this); }  // remove setupmapifneeded method  @override public void onmapready(final googlemap googlemap) {     mmap=googlemap;      cameraupdate center = cameraupdatefactory.newlatlng(new latlng(32.065483, 34.824550));     cameraupdate zoom = cameraupdatefactory.zoomto(10);     mmap.movecamera(center);     mmap.animatecamera(zoom);      mmap.setonmarkerclicklistener(new googlemap.onmarkerclicklistener() {         // ...     });      // ... }