geolocation - Android LocationManager Location Updates not starting when device has no Internet -


i'm working on device entirely offline , has not connected internet since last time updated android 6.0.1

for while app worked fine , using google play services fusedlocationapi update every second , supposed do. stopped working after made changes other parts of code , i'm @ loss why. thought problem google play services switched out android's location services instructed in this guide.

i have cut out code should irrelevant problem. may have cut out variables accident working in android studio , there aren't missing variables in there that's not issue. using butterknife there annotations.

here logcat app created turning location requests on , off switch:

08-01 11:04:53.289 11532-11532/mil.navy.nrl.androidrobocontroller w/system: classloader referenced unknown path: /data/app/mil.navy.nrl.androidrobocontroller-1/lib/arm 08-01 11:04:53.534 11532-11532/mil.navy.nrl.androidrobocontroller w/system: classloader referenced unknown path: /data/app/mil.navy.nrl.androidrobocontroller-1/lib/arm 08-01 11:04:53.869 11532-11532/mil.navy.nrl.androidrobocontroller w/art: before android 4.1, method android.graphics.porterduffcolorfilter android.support.graphics.drawable.vectordrawablecompat.updatetintfilter(android.graphics.porterduffcolorfilter, android.content.res.colorstatelist, android.graphics.porterduff$mode) have incorrectly overridden package-private method in android.graphics.drawable.drawable 08-01 11:04:54.057 11532-11574/mil.navy.nrl.androidrobocontroller d/openglrenderer: use egl_swap_behavior_preserved: true 08-01 11:04:54.118 11532-11574/mil.navy.nrl.androidrobocontroller i/adreno-egl: <qegldrvapi_eglinitialize:379>: qualcomm build: 10/21/15, 369a2ea, i96aee987eb 08-01 11:04:54.120 11532-11574/mil.navy.nrl.androidrobocontroller i/openglrenderer: initialized egl, version 1.4 08-01 11:04:56.439 11532-11532/mil.navy.nrl.androidrobocontroller v/trackactivity: requested location 08-01 11:04:56.440 11532-11532/mil.navy.nrl.androidrobocontroller v/trackactivity: permission android.permission.access_fine_location has been granted. 08-01 11:04:56.440 11532-11532/mil.navy.nrl.androidrobocontroller v/trackactivity: location updates requested 08-01 11:04:56.445 11532-11532/mil.navy.nrl.androidrobocontroller v/trackactivity: check checked , updated. 08-01 11:04:58.791 11532-11532/mil.navy.nrl.androidrobocontroller v/trackactivity: permission android.permission.access_fine_location has been granted. 08-01 11:04:58.794 11532-11532/mil.navy.nrl.androidrobocontroller v/trackactivity: check unchecked , updated. 

from know oncheckchanged() being called , calls startlocationupdates() fine. gets code should request location updates never seems respond them.

here's code:

lifecycle methods

package com.example.app;  import android.manifest; import android.content.context; import android.content.pm.packagemanager; import android.location.location; import android.location.locationlistener; import android.location.locationmanager; import android.os.bundle; import android.os.handler; import android.os.message; import android.support.v4.app.activitycompat; import android.support.v4.content.contextcompat; import android.support.v7.app.appcompatactivity; import android.support.v7.widget.switchcompat; import android.util.log; import android.widget.edittext; import android.widget.relativelayout;  import butterknife.bindview; import butterknife.butterknife; import butterknife.oncheckedchanged;  public class trackactivity extends appcompatactivity implements locationlistener,         activitycompat.onrequestpermissionsresultcallback {      private static final string log_tag = "trackactivity";     private static final boolean show_verbose = true;     private static final int request_fine_location_update = 1;     private static final int request_end_location_updates = 2;      protected locationmanager mlocationmanager;      private location mbestlocation;      @override     protected void oncreate(bundle savedinstancestate) {         super.oncreate(savedinstancestate);         setcontentview(r.layout.activity_track);          // butterknife bind method. required annotations work.         butterknife.bind(this);     }      @override     protected void onstart() {          mlocationmanager = (locationmanager) this.getsystemservice(context.location_service);          super.onstart();     }      @override     protected void onstop() {         // startlocationupdates(); <--- made typo here         endlocationupdates();         super.onstop();     } 

oncheckedchanged

@oncheckedchanged(r.id.track_send_location_switch) void oncheckchanged(boolean checked) {     if (checked) {         // unrelated code cut.          startlocationupdates();          if (show_verbose) log.v(log_tag, "check checked , updated.");     } else {         endlocationupdates();          // unrelated code cut          if (show_verbose) log.v(log_tag, "check unchecked , updated.");     } } 

startlocationupdates

protected void startlocationupdates() {     if (show_verbose) log.v(log_tag, "requested location");      if (checkrequestpermission(manifest.permission.access_fine_location, request_fine_location_update)) {         // todo: add high accuracy 1 hz location updates          if (show_verbose) log.v(log_tag, "location updates requested");          mlocationmanager.requestlocationupdates(locationmanager.gps_provider, 0, 0, this);         mlocationmanager.requestlocationupdates(locationmanager.network_provider, 0, 0, this);     } } 

endlocationupdates

protected void endlocationupdates() {     if (checkrequestpermission(             manifest.permission.access_fine_location, request_end_location_updates)) {         mlocationmanager.removeupdates(this);     } } 

checkrequestpermission

protected boolean checkrequestpermission(string permission, int requestcode) {     int permissioncheck = contextcompat.checkselfpermission(this, permission);     if(permissioncheck == packagemanager.permission_granted) {         if(show_verbose) log.v(log_tag, "permission " + permission + " has been granted.");         return true;     } else {         activitycompat.requestpermissions(this,                 new string[]{permission},                 requestcode);     }      return false; } 

onrequestpermissionsresult

@override public void onrequestpermissionsresult(int requestcode, string permissions[], int[] grantresults) {     switch (requestcode) {         case request_fine_location_once:             if(grantresults.length > 0 && grantresults[0] == packagemanager.permission_granted)                 startlocationupdates();             break;         case request_fine_location_update:             if(grantresults.length > 0 && grantresults[0] == packagemanager.permission_granted)                 startlocationupdates();             break;         case request_end_location_updates:             if(grantresults.length > 0 && grantresults[0] == packagemanager.permission_granted)                 endlocationupdates();             break;     } } 

onlocationchanged

@override public void onlocationchanged(location location) {     if(show_verbose) log.v(log_tag, "location request returned");      location locationtouse;      if(isbetterlocation(location, mbestlocation)) {         locationtouse = location;         mbestlocation = location;     } else {         locationtouse = mbestlocation;     }      if(show_verbose) log.v(log_tag, "onlocationchanged()");      // rest of app's code ommited.     dothingwithlocation(locationtouse); } 

locationlistener methods

@override public void onstatuschanged(string provider, int status, bundle extras) {  }  @override public void onproviderenabled(string provider) {     if(show_verbose) log.v(log_tag, "provider enabled"); }  @override public void onproviderdisabled(string provider) {     if(show_verbose) log.v(log_tag, "provider disabled"); } 

methods location strategies guide

protected boolean isbetterlocation(location location, location currentbestlocation) {     if(currentbestlocation == null)         return true;      long timedelta = location.gettime() - currentbestlocation.gettime();     boolean issignificantlynewer = timedelta > 10000;     boolean issignificantlyolder = timedelta < -10000;     boolean isnewer = timedelta > 0;      if (issignificantlynewer) {         return true;         // if new location more 2 minutes older, must worse     } else if (issignificantlyolder) {         return false;     }      // check whether new location fix more or less accurate     int accuracydelta = (int) (location.getaccuracy() - currentbestlocation.getaccuracy());     boolean islessaccurate = accuracydelta > 0;     boolean ismoreaccurate = accuracydelta < 0;     boolean issignificantlylessaccurate = accuracydelta > 200;      // check if old , new location same provider     boolean isfromsameprovider = issameprovider(location.getprovider(),             currentbestlocation.getprovider());      // determine location quality using combination of timeliness , accuracy     if (ismoreaccurate) {         return true;     } else if (isnewer && !islessaccurate) {         return true;     } else if (isnewer && !issignificantlylessaccurate && isfromsameprovider) {         return true;     }     return false; }  /** checks whether 2 providers same */ private boolean issameprovider(string provider1, string provider2) {     if (provider1 == null) {         return provider2 == null;     }     return provider1.equals(provider2); } 

androidmanifest.xml

<?xml version="1.0" encoding="utf-8"?> <manifest xmlns:android="http://schemas.android.com/apk/res/android"     package="com.example.app">      <uses-permission android:name="android.permission.internet" />     <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="com.example.app.trackactivity"             android:windowsoftinputmode="statehidden">             <intent-filter>                 <action android:name="android.intent.action.main" />                 <action android:name=".trackactivity" />                  <category android:name="android.intent.category.launcher" />             </intent-filter>         </activity>     </application>  </manifest> 

any appreciated! thanks!

turns out didn't have gps signal , causing issues. thought alright sitting next window taking forever connect gps (>15minutes suggested @cyrixmorten). given enough time connect gps found once walked outside, connect instantly.

in case needs test gps services, used this gps test app.


Comments