android - Finding user location -


i trying user location weather app. unable , have tried follow both google last known location guide, https://guides.codepath.com/android/retrieving-location-with-locationservices-api.

import android.manifest; import android.content.context; import android.content.pm.packagemanager; import android.graphics.drawable.drawable; import android.location.location; import android.net.connectivitymanager; import android.net.networkinfo; import android.os.bundle; import android.support.annotation.nonnull; import android.support.annotation.nullable; import android.support.v4.app.activitycompat; import android.support.v7.app.appcompatactivity; import android.util.log; import android.view.view; import android.widget.imageview; import android.widget.progressbar; import android.widget.textview; import android.widget.toast;  import com.google.android.gms.common.connectionresult; import com.google.android.gms.common.api.googleapiclient; import com.google.android.gms.location.locationrequest; import com.google.android.gms.location.locationservices;  import org.json.jsonexception; import org.json.jsonobject;  import java.io.ioexception;  import butterknife.bindview; import butterknife.butterknife; import okhttp3.call; import okhttp3.callback; import okhttp3.okhttpclient; import okhttp3.request; import okhttp3.response;  public class mainactivity extends appcompatactivity implements googleapiclient.connectioncallbacks, googleapiclient.onconnectionfailedlistener {      public static final string tag = mainactivity.class.getsimplename();      public currentweather mcurrentweather;      private googleapiclient mgoogleapiclient;     private locationrequest mlocationrequest;      double latitude;     double longitude;      @bindview(r.id.timelabel)     textview mtimelabel;     @bindview(r.id.temperaturelabel)     textview mtemperaturelabel;     @bindview(r.id.humidityvalue)     textview mhumidityvalue;     @bindview(r.id.precipvalue)     textview mprecipvalue;     @bindview(r.id.summarytextview)     textview msummarylabel;     @bindview(r.id.iconimageview)     imageview miconimageview;     @bindview(r.id.refreshimageview)     imageview mrefreshimageview;     @bindview(r.id.progressbar)     progressbar mprogressbar;      @override     protected void oncreate(bundle savedinstancestate) {         super.oncreate(savedinstancestate);         setcontentview(r.layout.activity_main);          mgoogleapiclient = new googleapiclient.builder(this)                 .addapi(locationservices.api)                 .addconnectioncallbacks(this)                 .addonconnectionfailedlistener(this).build();          // import view variables         butterknife.bind(this);          // set default progressbar invisible          mprogressbar.setvisibility(view.invisible);          // create onclick refresh button         mrefreshimageview.setonclicklistener(new view.onclicklistener() {             @override             public void onclick(view v) {                 getforecast(latitude, longitude);             }         });          getforecast(latitude, longitude);     }      @override     protected void onstart() {         super.onstart();         mgoogleapiclient.connect();     }      @override     protected void onstop() {         if (mgoogleapiclient != null) {             mgoogleapiclient.disconnect();         }         super.onstop();     }      @override     public void onconnected(@nullable bundle bundle) {          if (activitycompat.checkselfpermission(this, manifest.permission.access_fine_location) != packagemanager.permission_granted && activitycompat.checkselfpermission(this, manifest.permission.access_coarse_location) != packagemanager.permission_granted) {             // todo: consider calling             //    activitycompat#requestpermissions             // here request missing permissions, , overriding             //   public void onrequestpermissionsresult(int requestcode, string[] permissions,             //                                          int[] grantresults)             // handle case user grants permission. see documentation             // activitycompat#requestpermissions more details.             return;         }         location mcurrentlocation = locationservices.fusedlocationapi.getlastlocation(mgoogleapiclient);         if(mcurrentlocation != null){             log.d("debug", "current location: " + mcurrentlocation.tostring());             latitude = mcurrentlocation.getlatitude();             longitude = mcurrentlocation.getlongitude();         }     }      @override     public void onconnectionsuspended(int i) {         if (i == cause_service_disconnected) {             toast.maketext(this, "disconnected. please re-connect.", toast.length_short).show();         } else if (i == cause_network_lost) {             toast.maketext(this, "network lost. please re-connect.", toast.length_short).show();         }     } 

what trying achieve lat , long coordinates , save them global variables later used when making call getforecast().

androidmanifest.xml:

<?xml version="1.0" encoding="utf-8"?> <manifest package="com.leetinsider.skymate"           xmlns:android="http://schemas.android.com/apk/res/android">      <uses-permission android:name="android.permission.internet" />     <uses-permission android:name="android.permission.access_network_state" />     <uses-permission android:name="android.permission.access_coarse_location" />     <uses-permission android:name="android.permission.access_fine_location" />      <application         android:allowbackup="true"         android:icon="@mipmap/ic_launcher"         android:label="@string/app_name"         android:supportsrtl="true"         android:theme="@style/apptheme">         <activity android:name=".mainactivity"             android:screenorientation="portrait">             <intent-filter>                 <action android:name="android.intent.action.main"/>                  <category android:name="android.intent.category.launcher"/>             </intent-filter>         </activity>     </application>  </manifest> 

try following solution:

  • first, make sure have implemented correct locationlistener interface in activity class:

     com.google.android.gms.location.locationlistener 

then request appropriate permissions support android devices running v6.0

 private static final int my_permission_request_read_coarse_location = 102; 

then request permission:

@override public void onconnected(@nullable bundle bundle) {    // version of android using?   // answer = 6.0      if (activitycompat.checkselfpermission(this, manifest.permission.access_coarse_location) != packagemanager.permission_granted ) {         activitycompat.requestpermissions(thisactivity,               new string[]{manifest.permission.access_coarse_location},               my_permission_request_read_coarse_location);      }      location mcurrentlocation = locationservices.fusedlocationapi.getlastlocation(mgoogleapiclient);     if (mcurrentlocation != null) {         log.d(tag, "current location: " + mcurrentlocation.tostring());         latitude = mcurrentlocation.getlatitude();         longitude = mcurrentlocation.getlongitude();     }       startlocationupdates();  } 

to results permission requests @ runtime, override method:

@override public void onrequestpermissionsresult(int requestcode,     string permissions[], int[] grantresults) {     switch (requestcode) {        case my_permission_request_read_coarse_location:~~~~~~~~~~~         // if request cancelled, result arrays empty.         if (grantresults.length > 0             && grantresults[0] == packagemanager.permission_granted) {              // permission granted, yay!             // contacts-related task need do.          } else {              // permission denied, boo! disable             // functionality depends on permission.         }         break;     }      // other 'case' lines check other     // permissions app might request   } } 

then, method update location:

protected void startlocationupdates() {     mlocationrequest = locationrequest.create()             .setpriority(locationrequest.priority_high_accuracy)             .setinterval(update_interval)             .setfastestinterval(fastest_interval);     if (activitycompat.checkselfpermission(this, manifest.permission.access_coarse_location) != packagemanager.permission_granted) {          //request permission here above         return;     }      //there problem here because locationlistener cast activity        locationservices.fusedlocationapi.requestlocationupdates(mgoogleapiclient, mlocationrequest, this); } 

this should it;

happy coding!


Comments