0

Я работаю на устройстве, которое полностью отсутствует и не подключен к Интернету, так как в последний раз она была обновлена ​​до Android 6.0.1Android LocationManager Место обновление не запускается, когда устройство не имеет Интернета

Для в то время как это приложение отлично работало, и с помощью Google Play Services FusedLocationApi он обновлялся каждую секунду и выполнял то, что он должен был делать. Затем он внезапно прекратил работу после того, как внес некоторые изменения в другие части кода, и я не понимаю, почему. Я думал, что это может быть проблемой с Google Play Services, поэтому я переключил его с помощью служб определения местоположения Android, как указано в this guide.

Я вырезал код, который не должен касаться проблемы. Возможно, я случайно отключил некоторые переменные, но я работаю в Android Studio, и там нет никаких отсутствующих переменных, так что, вероятно, это не проблема. Я использую Butterknife, поэтому есть некоторые аннотации.

Вот Logcat из приложения, созданного для поворота запросы о местоположении и выключаться с помощью переключателя:

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. 

Из этого я знаю, что onCheckChanged() вызывается и он вызывает startLocationUpdates() прекрасно. Он даже попадает в код, который должен запрашивать обновления местоположения, но он никогда не реагирует на них.

Вот весь код:

Lifecycle Методы

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

LocationListener Методы

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

методы из 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 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> 

Любая помощь будет очень признателен! Благодаря!

+0

Как долго вы ждали? Будучи в автономном режиме, оба препятствуют расположению сети (так как вы запрашиваете его в коде btw?), А также A-GPS. В результате иногда казалось бы крайне долгое время блокировки для GPS, особенно если оно не использовалось какое-то время. Я бы сказал, либо позвольте мне подключиться к Интернету, либо попробовать еще раз, либо оставить запрос на GPS в течение как минимум 15 минут и посмотреть, что произойдет. Конечно, желательно с минимальным количеством препятствий между устройством и ясным небом. – cYrixmorten

+0

Я пробовал держать его в течение 15 минут, и ничего не случилось. Тем не менее, я заметил, что на днях я оставил его один на один час, когда я случайно начал обновление в onStop(). Затем он получал обновления. –

ответ

1

Оказывается, у меня не было очень хорошего сигнала GPS, и это было причиной моих проблем. Я подумал, что я хорошо сижу рядом с окном, но навсегда нужно было подключиться к GPS (> 15 минут, как было предложено @cYrixmorten). Учитывая достаточное время, чтобы он подключился к GPS, но я обнаружил, что как только я выйду на улицу, он будет подключаться почти мгновенно.

В случае, если кто-либо нуждается в проверке GPS-услуг, я использовал this Приложение GPS-теста.

+0

Вы должны принять ваш ответ – Olumide

+0

Не может быть еще 2 часа. –

+0

Рад, что у вас это работает, кстати :-) – cYrixmorten