0

Ich bin auf einem Gerät arbeiten, die vollständig offline ist und hat sich seit dem letzten Mal mit dem Internet verbunden es 6.0.1Android Locationmanager Location Updates startet nicht, wenn das Gerät kein Internet hat

Für eine auf Android wurde aktualisiert Während diese App einwandfrei funktionierte und Google Play Services FusedLocationApi nutzte, würde sie jede Sekunde aktualisieren und tun, was sie tun sollte. Dann hörte es plötzlich auf zu funktionieren, nachdem ich einige Änderungen an anderen Teilen des Codes vorgenommen hatte und ich weiß nicht warum. Ich dachte, es könnte ein Problem mit den Google Play-Diensten sein, deshalb habe ich es mit den Standortdiensten von Android wie in this guide angewiesen geändert.

Ich habe Code ausgeschnitten, der für das Problem irrelevant sein sollte. Ich habe vielleicht einige Variablen aus Versehen ausgeschnitten, aber ich arbeite in Android Studio und es gibt keine fehlenden Variablen darin, also ist das wahrscheinlich nicht das Problem. Ich benutze Butterknife, also gibt es einige Anmerkungen.

Hier ist Logcat von App zu Drehen der Standortanfragen an und mit dem Schalter erstellt:

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) would have incorrectly overridden the 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 and 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 and updated. 

Daraus Ich weiß, dass die onCheckChanged() aufgerufen wird, und es ruft startLocationUpdates() völlig in Ordnung. Es kommt sogar zu dem Code, der Standort-Updates anfordern sollte, aber es scheint nie darauf zu reagieren.

Hier ist der gesamte Code:

Lifecycle Methoden

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 FOR ANNOTATIONS TO WORK. 
     ButterKnife.bind(this); 
    } 

    @Override 
    protected void onStart() { 

     mLocationManager = (LocationManager) this.getSystemService(Context.LOCATION_SERVICE); 

     super.onStart(); 
    } 

    @Override 
    protected void onStop() { 
     // startLocationUpdates(); <--- Made a 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 and updated."); 
    } else { 
     endLocationUpdates(); 

     // Unrelated code cut 

     if (SHOW_VERBOSE) Log.v(LOG_TAG, "Check unchecked and 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 is ommited. 
    doThingWithLocation(locationToUse); 
} 

Location Methoden

@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"); 
} 

Methoden von Standortstrategien Leitfaden

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 the new location is more than two minutes older, it must be worse 
    } else if (isSignificantlyOlder) { 
     return false; 
    } 

    // Check whether the new location fix is 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 the old and new location are from the same provider 
    boolean isFromSameProvider = isSameProvider(location.getProvider(), 
      currentBestLocation.getProvider()); 

    // Determine location quality using a combination of timeliness and accuracy 
    if (isMoreAccurate) { 
     return true; 
    } else if (isNewer && !isLessAccurate) { 
     return true; 
    } else if (isNewer && !isSignificantlyLessAccurate && isFromSameProvider) { 
     return true; 
    } 
    return false; 
} 

/** Checks whether two providers are the 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> 

Jede Hilfe sehr geschätzt werden würde! Vielen Dank!

+0

Wie lange hast du gewartet? Offline zu sein, beide verhindern Netzwerk-Standort (also wie Sie es im Code btw anfordern?) Und auch A-GPS. Dies führt zu einer manchmal extrem langen Sperrzeit für das GPS, insbesondere wenn es längere Zeit nicht benutzt wurde. Ich würde sagen, entweder lassen Sie mich mit dem Internet verbinden und es erneut versuchen, oder lassen Sie es GPS für mindestens 15 Minuten und sehen, was passiert. Natürlich möglichst mit möglichst wenigen Hindernissen zwischen Gerät und klarem Himmel. – cYrixmorten

+0

Ich habe versucht, es für 15 Minuten zu halten und nichts passierte. Ich bemerkte jedoch neulich, dass ich es für eine Stunde in Ruhe gelassen habe, als ich versehentlich Updates in onStop() gestartet habe. Dann erhielt es Updates. –

Antwort

1

Stellt sich heraus, ich hatte kein sehr gutes GPS-Signal und das war, was meine Probleme verursachte. Ich dachte, es wäre in Ordnung, neben einem Fenster zu sitzen, aber es dauerte ewig, bis ich eine Verbindung zum GPS hatte (> 15 Minuten, wie von @cYrixmorten vorgeschlagen). Wenn genug Zeit zur Verfügung stand, würde es sich mit GPS verbinden, aber ich stellte fest, dass sobald ich nach draußen ging, es sich fast sofort verbinden würde.

Falls jemand GPS-Dienste testen muss, habe ich this GPS Test App verwendet.

+0

Sie sollten Ihre Antwort akzeptieren – Olumide

+0

Kann nicht für weitere 2 Stunden. –

+0

Ich bin froh, dass es funktioniert hat :-) – cYrixmorten