Android 6.0.1 сбой периодического определения местоположения gps

#android #gps

#Android #gps

Вопрос:

Я хотел бы создать фоновую службу для регистрации местоположения GPS. Когда дело доходит до выполнения, он не дает мне никаких периодических данных, независимо от того, в офисе, на улице или в сельской местности. Не могли бы вы рассказать мне, как получать местоположение GPS каждые n секунд? Иногда я получал исключение, подавленное нарушение политики StrictMode: получено StrictModeDiskReadViolation.

Мой код настроен следующим образом :

     public class TaskpointActivity extends FragmentActivity implements  LocationListener,
      GoogleMap.InfoWindowAdapter   {

        private static final long POLLING_FREQ = 1000 * 2;


    private LocationManager mLocationManager  ;  
@Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        try {

...


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

              mLocationManager.requestLocationUpdates(
                      LocationManager.GPS_PROVIDER, POLLING_FREQ,    1, this);

              mLocationManager.requestLocationUpdates(
                      LocationManager.NETWORK_PROVIDER, POLLING_FREQ,   1, this);

        } catch (Exception ex) { 
            SystemUtils.takeLog(this, ex.getMessage());
            ex.printStackTrace();
        }       
}

    @Override
    public void onStatusChanged(String provider, int status, Bundle extras) {
        // TODO Auto-generated method stub
        Log.i(TAG, "onStatusChanged PROVIDER:"   provider   " STATUS:"   String.valueOf(status));

    }

    @Override
    public void onProviderEnabled(String provider) {
        // TODO Auto-generated method stub
        Log.i(TAG, "onProviderEnabled PROVIDER:"   provider);
    }

    @Override
    public void onProviderDisabled(String provider) {
        // TODO Auto-generated method stub
        Log.i(TAG, "onProviderDisabled PROVIDER:"   provider);

    }

    @Override
    public void onLocationChanged(Location location) {
        // TODO Auto-generated method stub

        if(mLastLocation !=null) {
               deviceSpeed = Math.sqrt(  Math.pow(location.getLongitude() - mLastLocation.getLongitude(), 2)
                                 Math.pow(location.getLatitude() - mLastLocation.getLatitude(), 2)
               ) / (location.getTime() - this.mLastLocation.getTime());
        }else{
              mLastLocation = location;
        }

          if (location.hasSpeed())
               deviceSpeed = location.getSpeed();

        SystemUtils.takeLog(this , "location latitude  : "   location.getLatitude() );
        SystemUtils.takeLog(this , "location longitude  : "   location.getLongitude()  );
        SystemUtils.takeLog(this , "location speed device  : "   location.getSpeed() );
        SystemUtils.takeLog(this , "location speed calculated  : "    deviceSpeed  );

        LatLng startPosition = markerSingle!=null ? markerSingle.getPosition() :
                new LatLng(mLastLocation.getLatitude(), mLastLocation.getLongitude());

        if(executeFollowMe) {


            double latitu = startPosition.latitude;
            double longitu = startPosition.longitude  ;

            int fixed = 30;
            for(int i = 0 ; i < 30 ; i   ) {

                if(i < 10) { // east
                    longitu = longitu   (i 1) * 0.000003;
                }else if(i >=10 amp;amp; i < 20) { // curve
                    int incre = i 1 ;
                    longitu = longitu    incre  * 0.000003;
                    latitu = latitu   (fixed- incre) * 0.000003;
                }else if(i >=20 amp;amp; i < 30) { // north
                    latitu = latitu   (i 1) * 0.000003;
                }
                LatLng currentPostion = new LatLng (latitu , longitu) ;
                prepareFollowMe(currentPostion);    
                //startPosition
            }

            SystemUtils.takeLog(TaskpointActivity.this,  markerSingle!=null ? "prepare Follow me mock" :  "prepare Follow me real device");
            //LatLng positionX

        }
    }
  

Ответ №1:

Да, я тоже столкнулся с этой проблемой. Это происходит, когда мы используем

targetSdkVersion 23

в нашем

build.gradle

файл.

Когда вам нужно одновременно получить местоположение пользователя, вам нужно получить разрешение во время выполнения, тогда вы можете использовать

shouldShowRequestPermissionRationale()

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

для получения дополнительной информации проверьте это: https://developer.android.com/training/permissions/requesting.html

и еще один способ решить эту проблему, просто установите

targetSdkVersion 22

вместо

targetSdkVersion 23

.

Комментарии:

1. Я перешел на targetSdkVersion 22 и протестировал с Android 6.0.1. по-прежнему нет периодического отчета о местоположении

2. @Raju Gujarati Создайте одну службу и в onStartCommand() вызовите один пользовательский класс GPSTracker , чтобы получить текущую широту, длину. периодически