我怎样才能在某个时间到达我的位置?

时间:2018-03-30 11:48:04

标签: android location

我想知道如何获得我的位置(经度和纬度, 我在某个时间以最准确的方式在地图上不需要位置。例如,当两个设备之间发生断开时。

我见过很多Google API的例子,但他们更专注于跟踪而不是在某个时间获取坐标。

我在一些网站上读过getLastKnownLocation并不准确。

提前致谢。

1 个答案:

答案 0 :(得分:0)

我为获取当前位置lat和long值创建单独的类。 在课堂下面用于定位。

public class GPSController  implements
    LocationListener,
    GoogleApiClient.ConnectionCallbacks,
    GoogleApiClient.OnConnectionFailedListener

{     OnLocationUpdateListener onLocationUpdateListener;     public final String TAG = getClass()。getSimpleName();

private FusedLocationProviderApi fusedLocationProviderApi = LocationServices.FusedLocationApi;
GoogleApiClient googleApiClient;
LocationRequest mLocationRequest;
Location mCurrentLocation;
private static long INTERVAL = 1000 * 10;
private static long FASTEST_INTERVAL = 1000 * 5;
FragmentActivity mActivity;
private boolean isLiveUpdate = false;


PendingResult<LocationSettingsResult> result;


/**
 * Checking permission and connect with Google Location service
 * @param activity
 */
public GPSController(FragmentActivity activity) {

    this.mActivity = activity;
    if(PermissionManager.checkPermission(mActivity,PermissionManager.ACCESS_LOCATION))
    {
        if (!isGooglePlayServicesAvailable()) {
            CustomLogHandler.printInfolog("checking googleplayservice : ", "false");
            ((BaseActivity)mActivity).showAlertDialog(mActivity, mActivity.getString(R.string.app_name), mActivity.getString(R.string.play_service_not_found));
        } else {
            CustomLogHandler.printInfolog("checking googleplayservice : ", "true");
            createLocationRequest();
            initFuseAPI();

        }
    }
    else
    {
        PermissionManager.askForPermission(PermissionManager.ACCESS_LOCATION,mActivity);
    }

}

public void connectForLocation()
{
    createLocationRequest();
    initFuseAPI();
}

/**
 * Turn on Live update of location on given interval
 * @param value
 * @param INTERVAL
 * @param FASTEST_INTERVAL
 */
public void turnOnLiveUpdate(boolean value,long INTERVAL,long FASTEST_INTERVAL)
{
    isLiveUpdate = value;
    this.INTERVAL = INTERVAL;
    this.FASTEST_INTERVAL = FASTEST_INTERVAL;
}

/**
 * Turn off live update of location
 */
public void turnOffLiveUpdate()
{
    isLiveUpdate = false;
}

/**
 * Disconnect from Google location service
 */
public void disconnect()
{
    try {
        Log.d(TAG, "onStop fired ..............");
        googleApiClient.disconnect();
        Log.d(TAG, "isConnected ...............: " +googleApiClient.isConnected());
    }catch (Throwable throwable)
    {
        throwable.printStackTrace();
    }
}

/**
 * Resume Location update service if stopped
 */
public void onResumeUpdate()
{
    try {
        if(googleApiClient != null) {
            if (googleApiClient.isConnected()) {
                startLocationUpdates();
                Log.d(TAG, "Location update resumed .....................");
            }
        }
    }catch (Throwable throwable)
    {
        throwable.printStackTrace();
    }
}


public void setLocatonUpdateListener(OnLocationUpdateListener onLocationUpdateListener)
{
    this.onLocationUpdateListener  = onLocationUpdateListener;
}

/**
 * Create location update request
 */
protected void createLocationRequest() {
    try {
        mLocationRequest = new LocationRequest();
        mLocationRequest.setInterval(INTERVAL);
        mLocationRequest.setFastestInterval(FASTEST_INTERVAL);
        mLocationRequest.setPriority(LocationRequest.PRIORITY_HIGH_ACCURACY);
    }catch (Throwable throwable)
    {
        throwable.printStackTrace();
    }
}


/**
 * Initialize google location service
 */
void initFuseAPI()
{
    try
    {
        googleApiClient = new GoogleApiClient.Builder(mActivity)
                .addApi(LocationServices.API)
                .addConnectionCallbacks(this)
                .addOnConnectionFailedListener(this)
                .build();
        Log.d(TAG, "initFuseAPI fired ..............");
        googleApiClient.connect();
    }catch (Throwable throwable)
    {
        throwable.printStackTrace();
    }
}


/**
 * Check Google location service is available or not
 * @return
 */
private boolean isGooglePlayServicesAvailable() {
    int status = GooglePlayServicesUtil.isGooglePlayServicesAvailable(mActivity);
    if (ConnectionResult.SUCCESS == status) {
        return true;
    } else {
        GooglePlayServicesUtil.getErrorDialog(status, mActivity, 0).show();
        return false;
    }
}

/**
 * called when connected with google location service
 * @param bundle
 */
@Override
public void onConnected( Bundle bundle) {
    Log.d(TAG, "onConnected - isConnected ...............: " + googleApiClient.isConnected());
    LocationManager manager = (LocationManager) mActivity.getSystemService(Context.LOCATION_SERVICE );
    boolean statusOfGPS = manager.isProviderEnabled(LocationManager.GPS_PROVIDER);
    if(statusOfGPS) {
        startLocationUpdates();
    }else
    {
        enableGpsService();
    }
}

@Override
public void onConnectionSuspended(int i) {

}

@Override
public void onConnectionFailed( ConnectionResult connectionResult) {

}

/**
 * Location update received here
 * @param location
 */
@Override
public void onLocationChanged(Location location) {
    Log.d(TAG, "Firing onLocationChanged..............................................");
    mCurrentLocation = location;
    SetLocation();
}


void enableGpsService()
{
    try
    {
        LocationSettingsRequest.Builder builder = new LocationSettingsRequest.Builder()
                .addLocationRequest(mLocationRequest);
        builder.setAlwaysShow(true);
        result = LocationServices.SettingsApi.checkLocationSettings(googleApiClient, builder.build());
        result.setResultCallback(new ResultCallback<LocationSettingsResult>() {
            @Override
            public void onResult( LocationSettingsResult locationSettingsResult) {
                final Status status = locationSettingsResult.getStatus();
                switch (status.getStatusCode()) {
                    case LocationSettingsStatusCodes.SUCCESS:
                        //already connected to GPS
                        startLocationUpdates();
                        break;
                    case LocationSettingsStatusCodes.RESOLUTION_REQUIRED:
                        // Location settings are not satisfied. But could be fixed by
                        // showing the user a dialog.
                        try {
                            status.startResolutionForResult(mActivity, PermissionManager.REQUEST_LOCATION);
                            startLocationUpdates();
                        } catch (IntentSender.SendIntentException e) {
                            // Ignore the error.
                        }
                        break;
                    case LocationSettingsStatusCodes.SETTINGS_CHANGE_UNAVAILABLE:
                        //redirect user to setting screen, manually user can enble GPS
                        mActivity.startActivity(new Intent(android.provider.Settings.ACTION_LOCATION_SOURCE_SETTINGS));
                        break;
                }
            }
        });
    }catch (Throwable throwable)
    {
        throwable.printStackTrace();
    }
}





/**
 * Request location update service
 */
public void startLocationUpdates()
{
    try {
        //check required even you checked it previously
        if (PermissionManager.checkPermission(mActivity, PermissionManager.ACCESS_LOCATION))
        {
            fusedLocationProviderApi.requestLocationUpdates(googleApiClient, mLocationRequest, this);
            Log.d(TAG, "Location update started ..............: ");
        } else {
            PermissionManager.askForPermission(PermissionManager.ACCESS_LOCATION, mActivity);
        }
    }catch (Throwable throwable)
    {
        throwable.printStackTrace();
    }
}

/**
 * Stop location update
 */
public void stopLocationUpdates() {
    try {
        if(googleApiClient != null) {
            fusedLocationProviderApi.removeLocationUpdates(
                    googleApiClient, this);
            Log.d(TAG, "Location update stopped .......................");
        }
    }catch (Throwable throwable)
    {
        throwable.printStackTrace();
    }
}


/**
 * set location values received
 */
private void SetLocation()
{
    try {
        Log.d(TAG, "UI update initiated .............");
        if (null != mCurrentLocation) {
            onLocationUpdateListener.onLocationUpdate(mCurrentLocation);

            /**isLiveUpdate = true for Live update **/

            if (!isLiveUpdate) {
                fusedLocationProviderApi.removeLocationUpdates(googleApiClient,this);
            }
            googleApiClient.disconnect();

            //mCurrentLocation.getAccuracy()
            //mCurrentLocation.getProvider()

        } else {
            Log.d(TAG, "location is null ...............");
        }
    }catch (Throwable throwable)
    {
        throwable.printStackTrace();
    }
}

public Location getLocation(){
    return mCurrentLocation;
}
public static List<Address> getAddress(Double mLat, Double mLang, Context context)
{
    List<Address> addresses = null;
    try
    {
        Geocoder geocoder = new Geocoder(context, Locale.getDefault());
        addresses = geocoder.getFromLocation(mLat, mLang, 1);
    }catch (Exception e)
    {
        e.printStackTrace();
    }
    return  addresses;
}

/**
 * For receive location update
 */
public interface OnLocationUpdateListener {
     void onLocationUpdate(Location mCurrentLocation);
}

}

然后用于下面的活动类......

    private GPSController gpsController;
  @Override
public void onStop() {
    super.onStop();
    if (gpsController != null)
        gpsController.disconnect();
}

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

    if (gpsController != null)
        gpsController.stopLocationUpdates();
}

@Override
public void onResume() {
    super.onResume();
    gpsController = new GPSController(getActivity());
    gpsController.setLocatonUpdateListener(this);
    if (gpsController != null)
        gpsController.onResumeUpdate();

}
   @Override
public void onLocationUpdate(Location mCurrentLocation) {
    CURRENT_LET = String.valueOf(mCurrentLocation.getLatitude());
    CURRENT_LANG = String.valueOf(mCurrentLocation.getLongitude());
    loadMoreItems();
}

也是pl note活动类在接口下面实现这个..

implements GPSController.OnLocationUpdateListener

如果您不需要,可以删除权限代码。

add还在清单文件中添加两个权限..

<uses-permission android:name="android.permission.INTERNET"/>
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION"/>
<uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION"/>