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() { // ... }); // ... }