2013-08-07 122 views
13

这是一个已被问了很多次的问题,但我找不到始终有效的解决方案。onLocationChanged未在某些设备上调用

我正在开发一个使用融合位置提供程序的应用程序。 在onConnected()方法中,我请求位置更新,并且一旦生成位置修复并且调用onLocationChanged(),就会启动应用程序逻辑。 (请参阅下面的我的代码)。

问题onLocationChanged()方法不会被调用的一些设备。我使用三星Tab 2和三星Galaxy Grand进行测试。此代码在Tab 2上工作得很好,但在Grand上无效。通过不起作用,我的意思是locationClient获得连接,但不会调用onLocationChanged()

此前,我使用位置管理器获取位置,并在该实现中发生了同样的问题。所以,我试图实现融合的位置提供商,但我仍然遇到同样的问题。

任何人都可以帮我解决这个问题吗?有什么我在这里失踪?

public class MainActivity extends Activity implements GooglePlayServicesClient.ConnectionCallbacks, OnConnectionFailedListener, LocationListener { 

LocationClient locationclient; 
LocationRequest lr; 
Location loc1; 
static String address; 

@Override 
protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.activity_main);  

    locationclient = new LocationClient(this,this,this); 
    locationclient.connect();   

} 

@Override 
public void onConnected(Bundle arg0) { 
    // TODO Auto-generated method stub 

    lr=LocationRequest.create(); 
    lr.setInterval(100); 
    locationclient.requestLocationUpdates(lr, this); 
    Log.d("LocationClient","On Connected"); 
} 

@Override 
public void onDisconnected() { 
    // TODO Auto-generated method stub 
    locationclient.disconnect(); 

} 

@Override 
public void onConnectionFailed(ConnectionResult arg0) { 
    // TODO Auto-generated method stub 

} 

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

    // Application Logic   

    Log.d("LocationClient","Last Known Location LC:" + loc.getLatitude() + "," + loc.getLongitude()); 
} 
} 
+0

如果onConnected()不会被调用onConnectionFailed()应该被触发。你看看ConnectionResult? –

+0

正在调用onConnected()并建立连接。我已在两台设备上检查过。在onConnected()我请求位置更新,然后不会导致onLocationChanged调用。 – Rohit

+2

您是否找到解决方法或解决方法?我面临同样的问题 – gian1200

回答

0

看看你是否通过测试if(loc == null)来获得通过的位置。即使它是同一个提供者,也许一个设备会返回null并被轰出,导致看起来不是正在触发。

+0

检查没有帮助。 – Rohit

0

这可能是无意义的,但我以前遇到过这个问题,有人建议你应该创建自己的LocationListener,而不是让MainActivity实现LocationListener。基本上这个:

locationclient.requestLocationUpdates(lr, your_location_listener); 

希望这会有所帮助。

+0

没有这也没有帮助。 – Rohit

0

我解决了这个由两个参数,最小距离和最小时间更新的间隔设置为0 按什么我已经2台设备,现在onLocationChanged测试()被请求更新后定期调用。

+0

我也开始接触这种方法。在某些设备上,我无法获得定位。 – Rohit

0

尝试删除并重新安装“google play services”。从谷歌电子市场链接波纹管安装它, google play services

-1

这里检查这个代码了...

public class MyActivity extends Activity implements LocationListener { 
double destLat, destLong; 

LocationManager locationManager; 

@Override 
public void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 

    locationManager = (LocationManager) getSystemService(Context.LOCATION_SERVICE); 
    locationManager.requestLocationUpdates(LocationManager.GPS_PROVIDER, 0, 0, this); 

} 

@Override 
public void onLocationChanged(Location location) { 
    // TODO Auto-generated method stub 
    destLat = location.getLatitude(); 
    destLong = location.getLongitude(); 
} 

@Override 
public void onProviderDisabled(String provider) { 
    // TODO Auto-generated method stub 

} 

@Override 
public void onProviderEnabled(String provider) { 
    // TODO Auto-generated method stub 

} 

@Override 
public void onStatusChanged(String provider, int status, Bundle extras) { 
    // TODO Auto-generated method stub 

} 
+0

本示例未使用Fused Location API。 –

2

我观察到的Galaxy Nexus相同的行为,并承认两件事情引起onLocationChanged()不被调用。有

  1. 系统设置中未启用相应的位置源。对于PRIORITY_HIGH_ACCURACY必须启用GPS卫星,对于PRIORITY_BALANCED_POWER_ACCURACYWi-Fi &移动网络位置必须启用。

  2. 即使对于启用的位置来源,也可能没有有效的位置信息可用。例如,PRIORITY_HIGH_ACCURACY源已启用,但没有(或不好)GPS接收(例如,设备在建筑物内)。或者PRIORITY_BALANCED_POWER_ACCURACY源已启用,但Wi-Fi和移动数据均已关闭。在这些情况下,无法检测到位置,并且不会调用onLocationChanged()

要解决#1我甚至连接到谷歌服务API之前检查居民点源是否已启用,如果他们都关掉,然​​后我通知用户让他/她来存取位置。

为了解决#2我决定使用LocationRequest.setExpirationDuration()。我设置了约10秒的超时时间,并且在呼叫requestLocationUpdates()后立即发送延迟了相同的10秒的回叫。如果延迟回拨在requestLocationUpdates()之前被调用,这意味着由于原因#2无法检测到位置。我做了三次重试,然后向用户显示一条错误消息。

Android文档在这个地方不是很好,这就是为什么我希望这有助于。

+0

您能否为您的#2解决方案多解释一下?我不是很了解它 – roostaamir

+0

@roostaamir我更新了答案。 –

1
lr.setInterval(100); 

有了它你的间隔是0.1秒,所以它很难让GPS芯片组检测到位置。您的间隔应> 1秒(我是> 10)

locationRequest应该设置:

setPriority(LocationRequest.PRIORITY_HIGH_ACCURACY) 因为PRIORITY_BALANCED_POWER_ACCURACY在户外它没有得到位置。代码将如下所示:

lr=LocationRequest.create(); 

lr.setInterval(5 * 1000);// 5s 

lr.setPriority(LocationRequest.PRIORITY_HIGH_ACCURACY); 
locationclient.requestLocationUpdates(lr, this); 

希望得到这个帮助。

相关问题