java - How to get current location within a Google Maps Fragment in a ViewPager with TabLayout -
i managed implement tablayout. within 1 of tabs google maps fragment. want ask permission access user's location , place marker on current location. of right now, dialog box not show , not know why. can me?
public class mapsfragment extends fragment implements onmapreadycallback{ googlemap mgooglemap; mapview mmapview; view mview; locationmanager locationmanager; static final int request_location = 1; public mapsfragment() { // required empty public constructor } @override public view oncreateview(layoutinflater inflater, viewgroup container, bundle savedinstancestate) { // inflate layout fragment mview = inflater.inflate(r.layout.fragment_maps,container,false); return mview; } @override public void onviewcreated(view view, bundle savedinstancestate){ super.onviewcreated(view, savedinstancestate); mmapview = (mapview) mview.findviewbyid(r.id.googlemap); if(mmapview != null){ mmapview.oncreate(null); mmapview.onresume(); mmapview.getmapasync(this); } } @override public void onmapready(googlemap googlemap) { mgooglemap = googlemap; googlemap.setmaptype(googlemap.map_type_normal); //initialize google play services if(build.version.sdk_int >= build.version_codes.m){ if(contextcompat.checkselfpermission(getcontext(), manifest.permission.access_fine_location) == packagemanager.permission_granted){ //location permission gratned mapsinitializer.initialize(getcontext()); mgooglemap.setmylocationenabled(true); } } googlemap.addmarker(new markeroptions().position(new latlng(36.652527, -121.797277)).title("csumb")); cameraposition csumb = cameraposition.builder().target(new latlng(36.6538, -121.797277)).zoom(16).bearing(0).tilt(45).build(); googlemap.movecamera(cameraupdatefactory.newcameraposition(csumb)); } void getlocation(){ locationmanager = (locationmanager)getactivity() .getsystemservice(context.location_service); getlocation(); if(activitycompat.checkselfpermission(getcontext(), manifest.permission.access_fine_location) != packagemanager.permission_granted && activitycompat.checkselfpermission(getcontext(), manifest.permission.access_coarse_location) != packagemanager.permission_granted){ }else{ location location = locationmanager.getlastknownlocation(locationmanager.network_provider); if(location!= null){ double latti = location.getlatitude(); double longi = location.getlongitude(); toast.maketext(getactivity(),"location " + string.valueof(latti) + ", " + string.valueof(longi),toast.length_long); log.e("maps fragment", "location is: " + string.valueof(latti) + ", " + string.valueof(longi)); } else{ log.e("maps fragment", "unable find current location."); } } } @override public void onrequestpermissionsresult(int requestcode, @nonnull string[] permissions, @nonnull int[] grantresults) { super.onrequestpermissionsresult(requestcode, permissions, grantresults); switch (requestcode) { case request_location: getlocation(); break; } } @override public void onresume() { super.onresume(); mmapview.onresume(); } @override public void onpause() { super.onpause(); mmapview.onpause(); } @override public void ondestroy() { super.ondestroy(); mmapview.ondestroy(); } @override public void onlowmemory() { super.onlowmemory(); mmapview.onlowmemory(); } }
this close other answer here, however, answer doesn't explain how using viewpager tablayout.
first, piece sets apart other answer, you'll need keep reference current fragment in fragmentpageradapter using instantiateitem() override.
also, note onrequestpermissionsresult() method needed here in activity in order route user's permission request response fragment.
here full activity code:
public class mainactivity extends appcompatactivity { viewpager viewpager; pageradapter pageradapter; @override protected void oncreate(bundle savedinstancestate) { super.oncreate(savedinstancestate); setcontentview(r.layout.activity_main); toolbar toolbar = (toolbar) findviewbyid(r.id.toolbar); setsupportactionbar(toolbar); // viewpager , set it's pageradapter can display items viewpager = (viewpager) findviewbyid(r.id.viewpager); pageradapter = new pageradapter(getsupportfragmentmanager(), mainactivity.this); viewpager.setadapter(pageradapter); // give tablayout viewpager tablayout tablayout = (tablayout) findviewbyid(r.id.tab_layout); tablayout.setupwithviewpager(viewpager); // iterate on tabs , set custom view (int = 0; < tablayout.gettabcount(); i++) { tablayout.tab tab = tablayout.gettabat(i); tab.setcustomview(pageradapter.gettabview(i)); } } class pageradapter extends fragmentpageradapter { string tabtitles[] = new string[] { "tab one", "tab two", "tab three", }; public fragment[] fragments = new fragment[tabtitles.length]; context context; public pageradapter(fragmentmanager fm, context context) { super(fm); this.context = context; } @override public int getcount() { return tabtitles.length; } @override public fragment getitem(int position) { switch (position) { case 0: return new mapfragment(); case 1: return new blankfragment(); case 2: return new blankfragment(); } return null; } @override public charsequence getpagetitle(int position) { // generate title based on item position return tabtitles[position]; } public view gettabview(int position) { view tab = layoutinflater.from(mainactivity.this).inflate(r.layout.custom_tab, null); textview tv = (textview) tab.findviewbyid(r.id.custom_text); tv.settext(tabtitles[position]); return tab; } //this populates fragment reference array: @override public object instantiateitem(viewgroup container, int position) { fragment createdfragment = (fragment) super.instantiateitem(container, position); fragments[position] = createdfragment; return createdfragment; } } @override public void onrequestpermissionsresult(int requestcode, string permissions[], int[] grantresults) { if (requestcode == mapfragment.my_permissions_request_location){ mapfragment mapfragment = (mapfragment) pageradapter.fragments[0]; if (mapfragment != null) { mapfragment.onrequestpermissionsresult(requestcode, permissions, grantresults); } } else { super.onrequestpermissionsresult(requestcode, permissions, grantresults); } } } activity_main.xml:
<?xml version="1.0" encoding="utf-8"?> <android.support.design.widget.coordinatorlayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:app="http://schemas.android.com/apk/res-auto" xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" android:layout_height="match_parent" android:fitssystemwindows="true" tools:context=".mainactivity"> <android.support.design.widget.appbarlayout android:layout_width="match_parent" android:layout_height="wrap_content" android:theme="@style/apptheme.appbaroverlay" android:elevation="6dp"> <android.support.v7.widget.toolbar android:id="@+id/toolbar" android:layout_width="match_parent" android:layout_height="?attr/actionbarsize" android:background="?attr/colorprimary" android:theme="@style/themeoverlay.appcompat.dark.actionbar" app:popuptheme="@style/themeoverlay.appcompat.light" android:elevation="0dp" /> <android.support.design.widget.tablayout android:id="@+id/tab_layout" app:tabmode="fixed" android:layout_width="match_parent" android:layout_height="wrap_content" android:layout_below="@+id/toolbar" android:background="?attr/colorprimary" android:elevation="0dp" app:tabtextcolor="#d3d3d3" app:tabselectedtextcolor="#ffffff" app:tabindicatorcolor="#ff00ff" android:minheight="?attr/actionbarsize" /> </android.support.design.widget.appbarlayout> <android.support.v4.view.viewpager android:id="@+id/viewpager" android:layout_width="match_parent" android:layout_height="fill_parent" app:layout_behavior="@string/appbar_scrolling_view_behavior" /> </android.support.design.widget.coordinatorlayout> custom_tab.xml
<?xml version="1.0" encoding="utf-8"?> <linearlayout xmlns:android="http://schemas.android.com/apk/res/android" android:orientation="vertical" android:layout_width="match_parent" android:layout_height="match_parent"> <textview android:id="@+id/custom_text" android:layout_width="wrap_content" android:layout_height="match_parent" android:background="?attr/selectableitembackground" android:gravity="center" android:textsize="16dip" android:textcolor="#ffffff" android:maxlines="1" /> </linearlayout> for map fragment, use same code other answer:
public class mapfragment extends supportmapfragment implements onmapreadycallback, googleapiclient.connectioncallbacks, googleapiclient.onconnectionfailedlistener, locationlistener { googlemap mgooglemap; locationrequest mlocationrequest; googleapiclient mgoogleapiclient; location mlastlocation; marker mcurrlocationmarker; @override public void onresume() { super.onresume(); setupmapifneeded(); } private void setupmapifneeded() { if (mgooglemap == null) { getmapasync(this); } } @override public void onpause() { super.onpause(); //stop location updates when activity no longer active if (mgoogleapiclient != null) { locationservices.fusedlocationapi.removelocationupdates(mgoogleapiclient, this); } } @override public void onmapready(googlemap googlemap) { mgooglemap=googlemap; mgooglemap.setmaptype(googlemap.map_type_hybrid); //initialize google play services if (android.os.build.version.sdk_int >= build.version_codes.m) { if (contextcompat.checkselfpermission(getactivity(), manifest.permission.access_fine_location) == packagemanager.permission_granted) { //location permission granted buildgoogleapiclient(); mgooglemap.setmylocationenabled(true); } else { //request location permission checklocationpermission(); } } else { buildgoogleapiclient(); mgooglemap.setmylocationenabled(true); } } protected synchronized void buildgoogleapiclient() { mgoogleapiclient = new googleapiclient.builder(getactivity()) .addconnectioncallbacks(this) .addonconnectionfailedlistener(this) .addapi(locationservices.api) .build(); mgoogleapiclient.connect(); } @override public void onconnected(bundle bundle) { mlocationrequest = new locationrequest(); mlocationrequest.setinterval(1000); mlocationrequest.setfastestinterval(1000); mlocationrequest.setpriority(locationrequest.priority_balanced_power_accuracy); if (contextcompat.checkselfpermission(getactivity(), manifest.permission.access_fine_location) == packagemanager.permission_granted) { locationservices.fusedlocationapi.requestlocationupdates(mgoogleapiclient, mlocationrequest, this); } } @override public void onconnectionsuspended(int i) {} @override public void onconnectionfailed(connectionresult connectionresult) {} @override public void onlocationchanged(location location) { mlastlocation = location; if (mcurrlocationmarker != null) { mcurrlocationmarker.remove(); } //place current location marker latlng latlng = new latlng(location.getlatitude(), location.getlongitude()); markeroptions markeroptions = new markeroptions(); markeroptions.position(latlng); markeroptions.title("current position"); markeroptions.icon(bitmapdescriptorfactory.defaultmarker(bitmapdescriptorfactory.hue_magenta)); mcurrlocationmarker = mgooglemap.addmarker(markeroptions); //move map camera mgooglemap.movecamera(cameraupdatefactory.newlatlng(latlng)); mgooglemap.animatecamera(cameraupdatefactory.zoomto(11)); //optionally, stop location updates if current location needed if (mgoogleapiclient != null) { locationservices.fusedlocationapi.removelocationupdates(mgoogleapiclient, this); } } public static final int my_permissions_request_location = 99; private void checklocationpermission() { if (contextcompat.checkselfpermission(getactivity(), manifest.permission.access_fine_location) != packagemanager.permission_granted) { // should show explanation? if (activitycompat.shouldshowrequestpermissionrationale(getactivity(), manifest.permission.access_fine_location)) { // show explanation user *asynchronously* -- don't block // thread waiting user's response! after user // sees explanation, try again request permission. new alertdialog.builder(getactivity()) .settitle("location permission needed") .setmessage("this app needs location permission, please accept use location functionality") .setpositivebutton("ok", new dialoginterface.onclicklistener() { @override public void onclick(dialoginterface dialoginterface, int i) { //prompt user once explanation has been shown activitycompat.requestpermissions(getactivity(), new string[]{manifest.permission.access_fine_location}, my_permissions_request_location ); } }) .create() .show(); } else { // no explanation needed, can request permission. activitycompat.requestpermissions(getactivity(), new string[]{manifest.permission.access_fine_location}, my_permissions_request_location ); } } } @override public void onrequestpermissionsresult(int requestcode, string permissions[], int[] grantresults) { switch (requestcode) { case my_permissions_request_location: { // if request cancelled, result arrays empty. if (grantresults.length > 0 && grantresults[0] == packagemanager.permission_granted) { // permission granted, yay! // location-related task need do. if (contextcompat.checkselfpermission(getactivity(), manifest.permission.access_fine_location) == packagemanager.permission_granted) { if (mgoogleapiclient == null) { buildgoogleapiclient(); } mgooglemap.setmylocationenabled(true); } } else { // permission denied, boo! disable // functionality depends on permission. toast.maketext(getactivity(), "permission denied", toast.length_long).show(); } return; } // other 'case' lines check other // permissions app might request } } } result
first, location permission prompt:
once user has accepted permission @ runtime, show user's current location:


Comments
Post a Comment