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:

enter image description here

once user has accepted permission @ runtime, show user's current location:

enter image description here


Comments

Popular posts from this blog

inversion of control - Autofac named registration constructor injection -

verilog - Systemverilog dynamic casting issues -

ios - Change Storyboard View using Seague -