Google API v2 ...我正在使用地图记录从一个点到终点和距离的时间

时间:2015-07-24 16:34:52

标签: java android mobile android-studio google-maps-android-api-2

我直接在新项目中使用了Google API。我没有从空白活动中创建它。现在,当您打开应用程序时,它会在您每分钟开车时使用地图实用程序中的图标记录时间。

我想在应用程序打开时添加一个开始标记,可能会创建一个停止日志记录的按钮并在那里添加标记。在我想要的那些标记之间计算距离(只要知道开始记录和计算距离的时间,就不需要开始和结束标记)。

我从Google开发控制台找到了计算距离演示,但我不确定如何将其应用到我的应用中。这是我的代码:

LocationActivity.java

import java.text.DateFormat;
import java.util.Date;

public class LocationActivity extends FragmentActivity implements
    LocationListener,
    GoogleApiClient.ConnectionCallbacks,
    GoogleApiClient.OnConnectionFailedListener {

private static final String TAG = "LocationActivity";
private static final long INTERVAL = 1000 * 30 * 1; //1 minute
private static final long FASTEST_INTERVAL = 1000 * 60 * 1; // 1 minute
Button btnFusedLocation;
TextView tvLocation;
LocationRequest mLocationRequest;
GoogleApiClient mGoogleApiClient;
Location mCurrentLocation;
String mLastUpdateTime;
GoogleMap googleMap;

protected void createLocationRequest() {
    mLocationRequest = new LocationRequest();
    mLocationRequest.setInterval(INTERVAL);
    mLocationRequest.setFastestInterval(FASTEST_INTERVAL);
    mLocationRequest.setPriority(LocationRequest.PRIORITY_HIGH_ACCURACY);
}

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    Log.d(TAG, "onCreate ...............................");
    //show error dialog if GoolglePlayServices not available
    if (!isGooglePlayServicesAvailable()) {
        finish();
    }
    createLocationRequest();
    mGoogleApiClient = new GoogleApiClient.Builder(this)
            .addApi(LocationServices.API)
            .addConnectionCallbacks(this)
            .addOnConnectionFailedListener(this)
            .build();

    setContentView(R.layout.activity_location);
    SupportMapFragment fm = (SupportMapFragment) getSupportFragmentManager()
            .findFragmentById(R.id.map);
    googleMap = fm.getMap();
    googleMap.getUiSettings().setZoomControlsEnabled(true);
    googleMap.setMapType(GoogleMap.MAP_TYPE_HYBRID);
    googleMap.moveCamera(CameraUpdateFactory.zoomTo(30));


}

@Override
public void onStart() {
    super.onStart();
    Log.d(TAG, "onStart fired ..............");
    mGoogleApiClient.connect();
}

@Override
public void onStop() {
    super.onStop();
    Log.d(TAG, "onStop fired ..............");
    mGoogleApiClient.disconnect();
    Log.d(TAG, "isConnected ...............: " + mGoogleApiClient.isConnected());
}

private boolean isGooglePlayServicesAvailable() {
    int status = GooglePlayServicesUtil.isGooglePlayServicesAvailable(this);
    if (ConnectionResult.SUCCESS == status) {
        return true;
    } else {
        GooglePlayServicesUtil.getErrorDialog(status, this, 0).show();
        return false;
    }
}

@Override
public void onConnected(Bundle bundle) {
    Log.d(TAG, "onConnected - isConnected ...............: " + mGoogleApiClient.isConnected());
    startLocationUpdates();
}

protected void startLocationUpdates() {
    PendingResult<Status> pendingResult = LocationServices.FusedLocationApi.requestLocationUpdates(
            mGoogleApiClient, mLocationRequest, this);
    Log.d(TAG, "Location update started ..............: ");
}

@Override
public void onConnectionSuspended(int i) {

}

@Override
public void onConnectionFailed(ConnectionResult connectionResult) {
    Log.d(TAG, "Connection failed: " + connectionResult.toString());
}

@Override
public void onLocationChanged(Location location) {
    Log.d(TAG, "Firing onLocationChanged..............................................");
    mCurrentLocation = location;
    mLastUpdateTime = DateFormat.getTimeInstance().format(new Date());
    addMarker();
}

private void addMarker() {
    MarkerOptions options = new MarkerOptions();

    // how to add the marker

    IconGenerator iconFactory = new IconGenerator(this);
    iconFactory.setStyle(IconGenerator.STYLE_PURPLE);
    options.icon(BitmapDescriptorFactory.fromBitmap(iconFactory.makeIcon(mLastUpdateTime)));
    options.anchor(iconFactory.getAnchorU(), iconFactory.getAnchorV());

    LatLng currentLatLng = new LatLng(mCurrentLocation.getLatitude(), mCurrentLocation.getLongitude());
    options.position(currentLatLng);
    Marker mapMarker = googleMap.addMarker(options);
    long atTime = mCurrentLocation.getTime();
    mLastUpdateTime = DateFormat.getTimeInstance().format(new Date(atTime));
    mapMarker.setTitle(mLastUpdateTime);
    Log.d(TAG, "Marker added.............................");
    googleMap.moveCamera(CameraUpdateFactory.newLatLngZoom(currentLatLng,
            13));
    Log.d(TAG, "Zoom done.............................");
}


@Override
protected void onPause() {
    super.onPause();
    stopLocationUpdates();
}

protected void stopLocationUpdates() {
    LocationServices.FusedLocationApi.removeLocationUpdates(
            mGoogleApiClient, this);
    Log.d(TAG, "Location update stopped .......................");
}

@Override
public void onResume() {
    super.onResume();
    if (mGoogleApiClient.isConnected()) {
        startLocationUpdates();
        Log.d(TAG, "Location update resumed .....................");
    }
}}

activity_location.xml

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:context=".TaskRoadMap" >

<TextView
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:text="@string/textView"
    android:id="@+id/textView"
    android:layout_below="@+id/map"
    android:layout_alignParentLeft="true"
    android:layout_alignParentStart="true" />

<fragment
    android:id="@+id/map"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    class="com.google.android.gms.maps.SupportMapFragment"
    tools:layout="@layout/abc_screen_simple" />

</RelativeLayout>

这是我认为我需要使用的Google演示代码:

private void showDistance() {
    double distance = SphericalUtil.computeDistanceBetween(mMarkerA.getPosition(), mMarkerB.getPosition());
    mTextView.setText("The markers are " + formatNumber(distance) + " apart.");
}

private void updatePolyline() {
    mPolyline.setPoints(Arrays.asList(mMarkerA.getPosition(), mMarkerB.getPosition()));
}

private String formatNumber(double distance) {
    String unit = "m";
    if (distance < 1) {
        distance *= 1000;
        unit = "mm";
    } else if (distance > 1000) {
        distance /= 1000;
        unit = "km";
    }

    return String.format("%4.3f%s", distance, unit);
}

0 个答案:

没有答案