启用NETWORK_PROVIDER的LocationListener,但从不调用onLocationChanged

问题描述 投票:42回答:8

我正在开发一个可以在服务中全天花费6和6分钟的时间来定位手机的应用程序,它可以正常工作,但有时网络提供商侦听器的方法OnLocationChanged不再被调用,而我不不知道为什么。

出于某种原因停止调用,但是提供程序已启用,并且列表器正在工作,当我手动启用或禁用提供程序时,会调用onProviderEnabledonProviderDisabled

NETWORK_PROVIDER发生了,GPS_PROVIDER很好用。

侦听器:

LocationListener locationListenerGPS = new LocationListener() {
        // @Override
        public void onStatusChanged(String provider, int status, Bundle extras) {
            // TODO locationListenerGPS onStatusChanged
            Log.d(TAG, "Provedor trocado");
        }

        // @Override
        public void onProviderEnabled(String provider) {
            Log.w(TAG, "PROVEDOR " + provider + " HABILITADO!");
        }

        // @Override
        public void onProviderDisabled(String provider) {
            Log.w(TAG, "PROVEDOR " + provider + " DESABILITADO!");
        }

        // @Override
        public void onLocationChanged(Location location) {

            longitudeGPS = location.getLongitude();
            latitudeGPS = location.getLatitude();
            Log.d(TAG,"LocationChangedGPS LAT: "+latitudeGPS+" longi: "+longitudeGPS);
            gpsComSinal = true;
        }
    };

    LocationListener locationListenerNET = new LocationListener() {

        // @Override
        public void onStatusChanged(String provider, int status, Bundle extras) {
            // TODO locationListenerNET onStatusChanged
            Log.d("Contele", "Provedor foi mudado");
        }

        // @Override
        public void onProviderEnabled(String provider) {
            Log.i(TAG, "PROVEDOR " + provider + " HABILITADO!");
        }

        // @Override
        public void onProviderDisabled(String provider) {
            Log.i(TAG, "PROVEDOR " + provider + " DESABILITADO!");
        }

        @Override
        public void onLocationChanged(Location location) {
            longitudeNET = location.getLongitude();
            latitudeNET = location.getLatitude();
            Log.d(TAG,"LocationChangedNET LAT: "+latitudeNET+" longi: "+longitudeNET);
            netComSinal = true;
        }
    };

代码:

public void initProviders() {

        localizacao = (LocationManager) getApplicationContext().getSystemService(LOCATION_SERVICE);


        localizacao.removeUpdates(locationListenerNET);
        localizacao.removeUpdates(locationListenerGPS);

        localizacao.requestLocationUpdates(LocationManager.GPS_PROVIDER, 0, 0,
                locationListenerGPS);

        localizacao.requestLocationUpdates(LocationManager.NETWORK_PROVIDER, 0,
                0, locationListenerNET);

        Log.d(TAG,"EsperaGPS");
        Handler esperaGPS = new Handler() {
            public void handleMessage(Message msg) {

                requestGPS();
            }
        };

        Message msgEsperaGPS = Message.obtain();
        msgEsperaGPS.what = 0;
        esperaGPS.sendMessageDelayed(msgEsperaGPS, 35000);
    }



    public void requestGPS() {
            if (gpsComSinal) {
                Log.d(TAG,"PEGO SINAL DE GPS");
                rastreio = "GPS";
                longitude = longitudeGPS;
                latitude = latitudeGPS;
                Log.d(TAG, "Utilizando provedor GPS.");
                localizacao.removeUpdates(locationListenerGPS);
                localizacao.removeUpdates(locationListenerNET);

            } else {
                Log.d(TAG,"Sem GPS... pegar NEt");
                // Setando os valores para usar network
                localizacao.removeUpdates(locationListenerGPS);
                localizacao.removeUpdates(locationListenerNET);
                localizacao
                        .requestLocationUpdates(LocationManager.NETWORK_PROVIDER,
                                0, 0, locationListenerNET);
                Log.d(TAG,"EsperaNET");

                        requestNET();
            }
        }

    public void requestNET() {
            if (netComSinal) {
                Log.d(TAG,"PEGO SINAL DE NET");
                rastreio = "NET";
                longitude = longitudeNET;
                latitude = latitudeNET;
                Log.d(TAG, "Utilizando provedor NET.");
                localizacao.removeUpdates(locationListenerNET);

            } else {
                localizacao.removeUpdates(locationListenerGPS);
                localizacao.removeUpdates(locationListenerNET);
                Log.d(TAG,"Sem sinal");
            }
        }

[在Samsung Galaxy S3中的报告:“在此处输入图像描述”“ >>

连续4天仍收到“ Sem sinal”。

此问题已在Galaxy Y和LG Optimus l5上发生

我进行了另一项测试,以查看其他应用程序是否具有NET位置,我发现它们通过了相同的问题,它们不能仅通过GetLastknowLocation获得NET位置;测试我是否曾使用Galaxy S3解决此问题,并禁用了GPS提供程序。 (在Cerberus中测试)。

关于NETWORKSLOCATIONS侦听器为何停止给出位置,我找不到任何解释,但这可能是因为它应该连续2或3天不停止工作。

我已经对其他应用程序进行了一些测试,以查看我的应用程序是否正在发生此问题,我发现它们针对相同的问题通过了测试,例如在Cerberus中:

我禁用了带有“ Sem sinal”问题的手机(Galaxy S3)中的GPS Provider,请看一下:

我的报告:“在此处输入图像描述”“ >>

和Cerberus(打印于2013年5月14日)报告:“在此处输入图像描述”

但是当我打开Goog​​le Maps似乎可以正常工作时,我试图移到一个远处,看看它是否会显示GetLastknowLocation,但是不,google maps暂时将我放在正确的位置,因此我意识到Google Maps正在使用motionevent在地图上移动我;

并且还要打印Google Maps日志以获取NetWorkProvider:

正常情况:

<< img src =“ https://image.soinside.com/eyJ1cmwiOiAiaHR0cHM6Ly9pLnN0YWNrLmltZ3VyLmNvbS9MU25RMC5wbmcifQ==” alt =“在此处输入图像描述”>

正弦案例:

<< img src =“ https://image.soinside.com/eyJ1cmwiOiAiaHR0cHM6Ly9pLnN0YWNrLmltZ3VyLmNvbS8xd0FCbi5qcGcifQ==” alt =“在此处输入图像描述”>

[我正在开发一个可以在服务中全天花费6和6分钟的时间来定位手机的应用程序,它可以正常工作,但是有时网络提供商的OnLocationChanged方法...

android geolocation gps locationmanager locationlistener
8个回答
28
投票
我在

网络提供商

中遇到过类似的问题,唯一的解决方法是强制设备重新启动

4
投票
我有完全相同的问题,对我来说唯一的解决方案是重新启动设备。有趣的是,除Google地图外,所有应用都没有位置信息。Google Maps应用程序以某种方式找到了位置!附言在服务中使用LocationListener,因此绝对不会出现引用错误,对象丢失等问题。

4
投票
我仍然有这个问题。但是我仍在寻找答案,我试图在NETWORK_PROVIDER的侦听器中实现它:

public void onStatusChanged(final String provider, final int status, final Bundle extras) { switch( status ) { case LocationProvider.AVAILABLE: // ... break; case LocationProvider.OUT_OF_SERVICE: // ... break; case LocationProvider.TEMPORARILY_UNAVAILABLE: // ... break; } }

因为:

OUT_OF_SERVICE,如果提供商不在服务范围内,并且预计在不久的将来不会改变; TEMPORARILY_UNAVAILABLE(如果提供程序暂时不可用,但预计不久将可用);如果提供者当前可用,则可用。


3
投票
[似乎是一个开放的错误,在Android开放源项目,问题跟踪程序:https://code.google.com/p/android/issues/detail?id=57707中报告了网络提供商问题。简而言之:2013年7月17日报道的问题-2015年1月7日最后一个博客,该问题从Android 4.1.x出现,出现在各种各样的设备中,“在最新的Play服务库中未解决”,博客中未建议解决方法。] >

我了解我们问题中的某些内容;您调用requestGPS方法,然后发现其位置。如果启用了gps,则通过gps获取。通过NET获得的其他意见。当呼叫requestGPS和控制提供程序时,它会获取lat-lang但删除更新。(不要通话,因为您删除了更新触发器);

if (gpsComSinal) { Log.d(TAG,"PEGO SINAL DE GPS"); rastreio = "GPS"; longitude = longitudeGPS; latitude = latitudeGPS; Log.d(TAG, "Utilizando provedor GPS."); // if you remove update don't call onLocationChanged localizacao.removeUpdates(locationListenerGPS); localizacao.removeUpdates(locationListenerNET); } else { Log.d(TAG,"Sem GPS... pegar NEt"); // Setando os valores para usar network localizacao.removeUpdates(locationListenerGPS); localizacao.removeUpdates(locationListenerNET); localizacao.requestLocationUpdates(LocationManager.NETWORK_PROVIDER, 0, 0, locationListenerNET); Log.d(TAG,"EsperaNET"); requestNET(); }


2
投票
我了解我们问题中的某些内容;您调用requestGPS方法,然后发现其位置。如果启用了gps,则通过gps获取。通过NET获得的其他意见。当呼叫requestGPS和控制提供程序时,它会获取lat-lang但删除更新。(不要通话,因为您删除了更新触发器);

2
投票
NETWORK_PROVIDER在手机的GPS正在运行并接收信号时不会更新。如果您关闭GPS并强制手机从网络上获取其位置,那么您将再次开始获取更新。

1
投票
我认为这是因为您的应用在后台被“杀死”了。我之前曾遇到过这个问题,并通过在服务中移动LocationListener的创建来解决了这个问题。确保也引用了侦听器。它可能可以解决问题。

0
投票
我遇到此问题,并且我发现网络提供商在某些android设备中不起作用,当您禁用GPS时,因为如果未启用GPS,它们会阻止访问位置数据。
© www.soinside.com 2019 - 2024. All rights reserved.