我开发获取手机整天的位置在6,6分钟服务的应用,它工作正常,但有时方法OnLocationChanged
网络提供商听众驻足被调用,我不知道为什么。
它由于某种原因停止被调用,但提供允许且李斯特工作,当我启用或禁用提供手动, onProviderEnabled
和onProviderDisabled
被调用。
它只是碰巧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");
}
}
在三星Galaxy S3报告:
仍然得到“教统局局长打了个平手”在连续4天。
这个问题已经发生银河Y和LG擎天柱L5
我做了另外一个测试,看看是否有其他aplications了净持仓,我发现他们都经过了同样的问题,他们无法获得的净头寸只是GetLastknowLocation; 来测试,我使用的银河S3这个问题,并且我禁用了GPS提供商。 (在Cerberus的测试)。
我找不到为什么NETWORKSLOCATIONS监听器停止给位置任何解释,但也可能是因为它不应该为2〜3天没有停止工作。
我做了一些测试,与其他aplications,看看这个问题只是我aplication发生,我发现他们在地狱犬通过为同样的问题,例如像:
我禁用的手机(银河S3)与“教统局局长打了个平手”的问题GPS供应商,一起来看看:
我的报告:
和地狱犬(打印在14/05/2013拍摄)报告:
但是当我打开谷歌地图,似乎工作确定,我想移动到距离的地方,看它是否要显示GetLastknowLocation
,但没有,谷歌地图把我的那一刻正确的地方,所以我意识到,使用motionevent移动我的地图谷歌地图是;
并同时打印谷歌地图的日志来获得NetWorkProvider:
正常情况下:
任何情况下签:
我曾经历过类似的问题,与网络服务提供者和唯一的解决办法是力装置重启 。 虽然谷歌地图是始终显示正确的位置,因为它使用其他传感器的信息也除了网络位置提供商。
但这里是个好消息 ,不是很长一段时间回谷歌加入熔融的位置提供的API通过其谷歌Play业务框架是超级容易比GPS /网络位置提供者使用。
支持高达API等级8,现在当我得到网络服务提供者的这个奇怪的问题,同时融合位置给我准确位置(不重新启动设备)。
我有一个COMMITED工作在这里FusedLocation测试项目 ,你可以复制和测试自己..
下面是代码片段: -
package com.example.fusedLoctionTest.service;
import android.app.Service;
import android.content.Context;
import android.content.Intent;
import android.location.Location;
import android.location.LocationManager;
import android.os.Bundle;
import android.os.Handler;
import android.os.IBinder;
import android.support.v4.content.LocalBroadcastManager;
import android.util.Log;
import com.google.android.gms.common.ConnectionResult;
import com.google.android.gms.common.GooglePlayServicesClient;
import com.google.android.gms.location.LocationClient;
import com.google.android.gms.location.LocationRequest;
public class FusedLocationService extends Service implements GooglePlayServicesClient.ConnectionCallbacks,
GooglePlayServicesClient.OnConnectionFailedListener, com.google.android.gms.location.LocationListener{
private static final LocationRequest REQUEST = LocationRequest.create()
.setInterval(0)
.setFastestInterval(0)
.setPriority(LocationRequest.PRIORITY_BALANCED_POWER_ACCURACY);
public static final String LOCATION_RECEIVED = "fused.location.received";
private Long now;
private LocationClient mLocationClient;
private final Object locking = new Object();
private Runnable onFusedLocationProviderTimeout;
private Handler handler = new Handler();
@Override
public int onStartCommand(Intent intent, int flags, int startId) {
super.onStartCommand(intent, flags, startId);
now = Long.valueOf(System.currentTimeMillis());
mLocationClient = new LocationClient(this, this, this);
mLocationClient.connect();
return START_STICKY;
}
@Override
public void onConnected(Bundle bundle) {
Log.d("FusedLocationService", "Fused Location Provider got connected successfully");
mLocationClient.requestLocationUpdates(REQUEST,this);
onFusedLocationProviderTimeout = new Runnable() {
public void run() {
Log.d("FusedLocationService", "location Timeout");
Location lastbestStaleLocation=getLastBestStaleLocation();
sendLocationUsingBroadCast(lastbestStaleLocation);
if(lastbestStaleLocation!=null)
Log.d("FusedLocationService", "Last best location returned ["+lastbestStaleLocation.getLatitude()+","+lastbestStaleLocation.getLongitude()+"] in "+(Long.valueOf(System.currentTimeMillis())-now)+" ms");
if(mLocationClient.isConnected())
mLocationClient.disconnect();
}
};
handler.postDelayed(onFusedLocationProviderTimeout, 20000);//20 sec
}
private void sendLocationUsingBroadCast(Location location) {
Intent locationBroadcast = new Intent(FusedLocationService.LOCATION_RECEIVED);
locationBroadcast.putExtra("LOCATION", location);
locationBroadcast.putExtra("TIME", Long.valueOf(System.currentTimeMillis()-now) +" ms");
LocalBroadcastManager.getInstance(this).sendBroadcast(locationBroadcast);
stopSelf();
}
@Override
public void onDisconnected() {
Log.d("FusedLocationService","Fused Location Provider got disconnected successfully");
stopSelf();
}
@Override
public void onLocationChanged(Location location) {
synchronized (locking){
Log.d("FusedLocationService", "Location received successfully ["+location.getLatitude()+","+location.getLongitude()+"] in "+(Long.valueOf(System.currentTimeMillis()-now))+" ms");
handler.removeCallbacks(onFusedLocationProviderTimeout);
if(mLocationClient.isConnected())
mLocationClient.removeLocationUpdates(this);
sendLocationUsingBroadCast(location);
if(mLocationClient.isConnected())
mLocationClient.disconnect();
}
}
@Override
public void onConnectionFailed(ConnectionResult connectionResult) {
Log.d("FusedLocationService", "Error connecting to Fused Location Provider");
}
public Location getLastBestStaleLocation() {
Location bestResult = null;
LocationManager locMgr = (LocationManager) getSystemService(Context.LOCATION_SERVICE);
Location lastFusedLocation=mLocationClient.getLastLocation();
Location gpsLocation = locMgr.getLastKnownLocation(LocationManager.GPS_PROVIDER);
Location networkLocation = locMgr.getLastKnownLocation(LocationManager.NETWORK_PROVIDER);
if (gpsLocation != null && networkLocation != null) {
if (gpsLocation.getTime() > networkLocation.getTime())
bestResult = gpsLocation;
} else if (gpsLocation != null) {
bestResult = gpsLocation;
} else if (networkLocation != null) {
bestResult = networkLocation;
}
//take Fused Location in to consideration while checking for last stale location
if (bestResult != null && lastFusedLocation != null) {
if (bestResult.getTime() < lastFusedLocation.getTime())
bestResult = lastFusedLocation;
}
return bestResult;
}
@Override
public IBinder onBind(Intent intent) {
return null;
}
}
我有完全一样的问题,对我来说,唯一的解决办法是重新启动设备。 有趣的,是没有任何的应用程序具有不同的谷歌地图的位置信息。
谷歌地图应用程序以某种方式找到一个位置!..
PS使用服务LocationListener的,所以它绝对不是一个坏参考,死对象等问题。
我仍然有这个问题。 但我仍然在寻找一个答案,我试图在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如果提供者暂时不可用,但预计将很快上市; 并用如果供应商是目前可用的。 onStatusChanged
我认为OUT_OF_SERVICE是我的问题,而且是在没有解决方案,到目前为止,只是重新启动该设备,然后,我尝试做一些报告,当这种情况发生,当这个ocurre我要求用户reebot设备,但很少设备recive此状态。
似乎是一个开放的bug,在Android开源项目,问题跟踪报道网络提供商的问题: https://code.google.com/p/android/issues/detail?id=57707 。 总之:报道2013年7月17日的问题 - 最后的博客2015年1月7日,发行于Android 4.1.x的出现,出现在各种各样的设备上,“没有在最新的Play服务库解决”,没有在博客建议的解决办法。
我明白在我们的问题的一些事情; 你叫requestGPS方法,然后dicover启用其location.If GPS,通过GPS获得。 通过NET Othervise戈特。 当呼叫requestGPS和控制供应商比得到的经纬度琅但删除更新(不要打电话,因为您删除更新触发)。
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();
}
当手机的GPS运行和接收信号NETWORK_PROVIDER不更新。 如果您关闭GPS,并迫使手机从网络获取其位置,那么你将再次开始获取更新。
我想这是因为你的应用程序获取的背景“杀死”。 我以前也遇到这个问题,我通过在服务移动LocationListener的创建解决它。 一定要保持对侦听器的引用过。 这也许会解决这个问题。
文章来源: LocationListener of NETWORK_PROVIDER is enabled but , onLocationChanged is never called