だから私は過去にFusedLocationを使っていましたが、多くの問題に直面していました。 APIが壊れています。正しく機能しないデバイスがいくつかあります。多くのリレーを融合させ、働くことができず、スタッフを適切に認識する活動認識。 ロケーションマネージャAPIに戻って終了します。ここで
スニペット:
初期ロケーションマネージャと異なるスレッド上で更新を要求し始めます。 私は個人的に各プロバイダ
if (mLocationManager == null) {
LOGGER.info("Location track,start called first time. Creating Location Manager");
mLocationManager = (LocationManager) mContextWeakReference.get()
.getSystemService(Context.LOCATION_SERVICE);
mLocationHandlerThread
= new HandlerThread("LocationThread", Thread.NORM_PRIORITY);
mLocationHandlerThread.start();
// Now get the Looper from the HandlerThread
// NOTE: This call will block until the HandlerThread gets control and initializes its Looper
Looper looper = mLocationHandlerThread.getLooper();
Location networkLastKnownLocation = null;
Location gpsLastKnownLocation = null;
mGpsLocationListener = new GpsLocationListener();
mNetworkLocationListener = new NetworkLocationListener();
// Register the listener with the Location Manager to receive location updates
if (mLocationManager.getAllProviders().contains(LocationManager.GPS_PROVIDER)) {
mLocationManager.requestLocationUpdates(LocationManager.GPS_PROVIDER,
LOCATION_REQUEST_INTERVAL_MILLIS, SMALLEST_DISPLACEMENT_METERS,
mGpsLocationListener,
looper);
gpsLastKnownLocation = mLocationManager
.getLastKnownLocation(LocationManager.GPS_PROVIDER);
} else {
setGpsProviderAvailable(false);
}
if (mLocationManager.getAllProviders().contains(LocationManager.NETWORK_PROVIDER)) {
networkLastKnownLocation = mLocationManager
.getLastKnownLocation(LocationManager.NETWORK_PROVIDER);
mLocationManager.requestLocationUpdates(LocationManager.NETWORK_PROVIDER,
LOCATION_REQUEST_INTERVAL_MILLIS, SMALLEST_DISPLACEMENT_METERS,
mNetworkLocationListener,
looper);
}
setLastKnownLocationDifferentProviders(gpsLastKnownLocation,
networkLastKnownLocation);
}
用に別のリスナーを登録し、リスナーがある:
public class GpsLocationListener implements LocationListener {
@Override
public void onLocationChanged(Location location) {
LOGGER.info("Location track ,onLocationChanged location={}", location);
switch (location.getProvider()) {
case LocationManager.GPS_PROVIDER:
if (mLocationManager != null) {
mLocationManager.removeUpdates(mNetworkLocationListener);
}
break;
}
setLastKnownLocation(location);
}
@Override
public void onStatusChanged(String provider, int status, Bundle extras) {
LOGGER.info("onStatusChanged: {}, status: {}", provider, status);
}
@Override
public void onProviderEnabled(String provider) {
LOGGER.info("onProviderEnabled: " + provider);
if (provider.equals(LocationManager.GPS_PROVIDER)) {
setGpsProviderAvailable(true);
}
}
@Override
public void onProviderDisabled(String provider) {
LOGGER.info("onProviderDisabled: " + provider);
if (provider.equals(LocationManager.GPS_PROVIDER)) {
setGpsProviderAvailable(false);
}
}
}
public class NetworkLocationListener implements LocationListener {
@Override
public void onLocationChanged(Location location) {
LOGGER.info("Location track ,onLocationChanged location={}", location);
switch (location.getProvider()) {
case LocationManager.NETWORK_PROVIDER:
setLastKnownLocation(location);
break;
}
}
@Override
public void onStatusChanged(String provider, int status, Bundle extras) {
LOGGER.info("onStatusChanged: {}, status: {}", provider, status);
}
@Override
public void onProviderEnabled(String provider) {
LOGGER.info("onProviderEnabled: " + provider);
if (provider.equals(LocationManager.GPS_PROVIDER)) {
setGpsProviderAvailable(true);
}
}
@Override
public void onProviderDisabled(String provider) {
LOGGER.info("onProviderDisabled: " + provider);
if (provider.equals(LocationManager.GPS_PROVIDER)) {
setGpsProviderAvailable(false);
}
}
}
がすべてのスレッドの登録を解除し、停止するのを忘れないでください:)
あなたなLocationRequestは何ですか? –
あなたは33kポイントを得ました。私は具体的な価値を推測する必要がありますか?コメントにない質問に入れてください。電話機の設定で高精度を有効にしましたか?いくつの位置情報を受け取ったのですか?どのデバイスをテストしましたか? GMSライブラリのバージョンは何ですか?あなたが考えることができるものは何でも役立ちます。 –
5年間メンバーになっていて、コメントにコードを投稿しています。ああ、男の子... – 2Dee