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
Post a Comment