没有互联网的公共汽车旅行时无法获得准确的位置

时间:2017-11-06 12:13:58

标签: android location android-gps fusedlocationproviderapi android-fusedlocation

我正在开发离线汽车追踪器android应用程序。它将在5分钟后更新位置并将其存储在SQLite中。我使用FusedLocationAPI但在没有Internet的公共汽车上旅行时无法获得准确的位置。我每9分钟准确度达到999米并获得相同的位置。 我将闹钟管理器设置为5分钟。

 public static void startAlarmManager(Context context) 
{
    preferences =context.getSharedPreferences(Constant.SHARED_PREF_NAME, Context.MODE_PRIVATE);
    int duration= Integer.parseInt(preferences.getString(Constant.DURATION_SHARED_PREF,Constant.CONSTANT_DURATION_SHARED_PREF));
    Log.d("duration",duration+"");



    alarmManager = (AlarmManager)context.getSystemService(Context.ALARM_SERVICE);
    gpsTrackerIntent = new Intent(context, GpsTrackerAlarmReceiver.class);
    pendingIntent = PendingIntent.getBroadcast(context, 0, gpsTrackerIntent, 0);

    alarmManager.setRepeating(AlarmManager.ELAPSED_REALTIME_WAKEUP,
            SystemClock.elapsedRealtime(),
            5*60000,
            pendingIntent);
}

它将发射广播接收器。

 public class GpsTrackerAlarmReceiver extends WakefulBroadcastReceiver {

private static final String TAG = "GpsTrackerAlarmReceiver";


@Override
public void onReceive(Context context, Intent intent) {


    LocationManager manager = (LocationManager) context.getSystemService(Context.LOCATION_SERVICE );
    boolean statusOfGPS = manager.isProviderEnabled(LocationManager.GPS_PROVIDER);

   if(statusOfGPS) {

        context.startService(new Intent(context, LocationService.class));

    }
}



}

这是位置服务。我正以这种方式获得位置。

 public class LocationService extends Service implements
    GoogleApiClient.ConnectionCallbacks,
    GoogleApiClient.OnConnectionFailedListener,
    LocationListener {
private static final String TAG = "LocationService";
public static GoogleApiClient googleApiClient;
private LocationRequest locationRequest;
public Context context;

private DatabaseHelper db;

private boolean currentlyProcessingLocation = false;



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

}

@Override
public int onStartCommand(Intent intent, int flags, int startId) {
    Log.d(TAG, "onStartCommand");

    if (!currentlyProcessingLocation) {
        currentlyProcessingLocation = true;
        startTracking();
    }


    return START_NOT_STICKY;
}

private void startTracking() {


    if (GooglePlayServicesUtil.isGooglePlayServicesAvailable(this) == ConnectionResult.SUCCESS) {

        googleApiClient = new GoogleApiClient.Builder(this)
                .addApi(LocationServices.API)
                .addConnectionCallbacks(this)
                .addOnConnectionFailedListener(this)
                .build();

        if (!googleApiClient.isConnected() || !googleApiClient.isConnecting()) {
            googleApiClient.connect();
        }
    } else {
        Log.e(TAG, "unable to connect to google play services.");
    }
}

@Override
public void onConnected(@Nullable Bundle bundle) {

    Log.d(TAG, "onConnected");



    locationRequest = LocationRequest.create();
    locationRequest.setInterval(1000); // milliseconds
    locationRequest.setFastestInterval(1000); // the fastest rate in milliseconds at which your app can handle location updates
    locationRequest.setPriority(LocationRequest.PRIORITY_HIGH_ACCURACY);


    if (ActivityCompat.checkSelfPermission(this, Manifest.permission.ACCESS_FINE_LOCATION) != PackageManager.PERMISSION_GRANTED && ActivityCompat.checkSelfPermission(this, Manifest.permission.ACCESS_COARSE_LOCATION) != PackageManager.PERMISSION_GRANTED) {

        return;
    }
    LocationServices.FusedLocationApi.requestLocationUpdates(
            googleApiClient, locationRequest, this);

}

@Override
public void onConnectionSuspended(int i) {
    Log.e(TAG, "GoogleApiClient connection has been suspend");
}

@Override
public void onLocationChanged(Location location) {
    Log.d(TAG, "onLocationChanged");

    startupdate(location);

}

private void startupdate(Location location) {

    if (location != null) {

        db=new DatabaseHelper(this);

        db.insertLocation(location.getLatitude(), location.getLongitude(), "FusedApi Provider",  location.getAccuracy());


        stopLocationUpdates();
        stopSelf();

    }
}

public void stopLocationUpdates() {
    if (googleApiClient != null && googleApiClient.isConnected()) {
        googleApiClient.disconnect();
    }
}


@Override
public void onConnectionFailed(@NonNull ConnectionResult connectionResult) {

    Log.e(TAG, "onConnectionFailed");

    stopLocationUpdates();
    stopSelf();
}

@Nullable
@Override
public IBinder onBind(Intent intent) {
    return null;
}



}

请帮助......如果我错了。提前谢谢。

1 个答案:

答案 0 :(得分:0)

当GPS不实用时,您可以使用LocationManager.NETWORK_PROVIDER,这是来自电话运营商的位置,该位置不如GPS准确,但在运营商拥有塔的任何地方都可用。我这样做的方法是设置一个标志isGpsAvailable()来查看是否为真我使用GPS,否则我使用网络提供的位置。 This Google's doc提供详细的解决方案,包括您可以使用的代码段,并根据您的需要更改它的方式。