自动显示位置谷歌android

时间:2016-04-10 12:02:59

标签: android google-maps reverse-geocoding

我正在努力解决问题,以自动显示我的反向地理编码结果。当我点击按钮获取位置时,它工作正常,但我希望它只是在加载应用程序时自动显示位置。

我的代码位于一个名为geocoding的Java类中,最终我希望在我已经创建的地图上的标记上显示此代码。

但是这个线程是消除按钮并显示位置作为地图加载的儿子。

@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main); // uses layout from mainactivity

    mResultReceiver = new AddressResultReceiver(new Handler());

    mLocationAddressTextView = (TextView) findViewById(R.id.location_address_view);
    mProgressBar = (ProgressBar) findViewById(R.id.progress_bar);
    mFetchAddressButton = (Button) findViewById(R.id.fetch_address_button);

    // Set defaults, then update using values stored in the Bundle.
    mAddressRequested = false;
    mAddressOutput = "";
    updateValuesFromBundle(savedInstanceState);

    updateUIWidgets();
    buildGoogleApiClient();
}
public void buttonOnClick(View view) { // this links the maps activity via the XML layout file
    startActivity(new Intent(Geocode.this, MapsActivity.class));
}

/**
 * Updates fields based on data stored in the bundle.
 */
private void updateValuesFromBundle(Bundle savedInstanceState) {
    if (savedInstanceState != null) {
        // Check savedInstanceState to see if the address was previously requested.
        if (savedInstanceState.keySet().contains(ADDRESS_REQUESTED_KEY)) {
            mAddressRequested = savedInstanceState.getBoolean(ADDRESS_REQUESTED_KEY);
        }
        // Check savedInstanceState to see if the location address string was previously found
        // and stored in the Bundle. If it was found, display the address string in the UI.
        if (savedInstanceState.keySet().contains(LOCATION_ADDRESS_KEY)) {
            mAddressOutput = savedInstanceState.getString(LOCATION_ADDRESS_KEY);
            displayAddressOutput();
        }
    }
}

/**
 * Builds a GoogleApiClient. Uses {@code #addApi} to request the LocationServices API.
 */
protected synchronized void buildGoogleApiClient() {
    mGoogleApiClient = new GoogleApiClient.Builder(this)
            .addConnectionCallbacks(this)
            .addOnConnectionFailedListener(this)
            .addApi(LocationServices.API)
            .build();
}


public void fetchAddressButtonHandler(View view) {
    // We only start the service to fetch the address if GoogleApiClient is connected.
    if (mGoogleApiClient.isConnected() && mLastLocation != null) {
        startIntentService();
    }

    mAddressRequested = true;
    updateUIWidgets();
}

@Override
protected void onStart() {
    super.onStart();
    mGoogleApiClient.connect();
}

@Override
protected void onStop() {
    super.onStop();
    if (mGoogleApiClient.isConnected()) {
        mGoogleApiClient.disconnect();
    }
}

/**
 * Runs when a GoogleApiClient object successfully connects.
 */
@Override
public void onConnected(Bundle connectionHint) {
    // Gets the best and most recent location currently available, which may be null
    // in rare cases when a location is not available.
    if (ActivityCompat.checkSelfPermission(this, Manifest.permission.ACCESS_FINE_LOCATION) != PackageManager.PERMISSION_GRANTED && ActivityCompat.checkSelfPermission(this, Manifest.permission.ACCESS_COARSE_LOCATION) != PackageManager.PERMISSION_GRANTED) {
        // TODO: Consider calling

        return;
    }
    mLastLocation = LocationServices.FusedLocationApi.getLastLocation(mGoogleApiClient);
    if (mLastLocation != null) {
        // Determine whether a Geocoder is available.
        if (!Geocoder.isPresent()) {
            Toast.makeText(this, R.string.no_geocoder_available, Toast.LENGTH_LONG).show();
            return;
        }
        if (mAddressRequested) {
            startIntentService();
        }
    }
}

/**
 * Creates an intent, adds location data to it as an extra, and starts the intent service for
 * fetching an address.
 */
protected void startIntentService() {
    // Create an intent for passing to the intent service responsible for fetching the address.
    Intent intent = new Intent(this, FetchAddressIntentService.class);

    // Pass the result receiver as an extra to the service.
    intent.putExtra(Constants.RECEIVER, mResultReceiver);

    // Pass the location data as an extra to the service.
    intent.putExtra(Constants.LOCATION_DATA_EXTRA, mLastLocation);


    startService(intent);
}

@Override
public void onConnectionFailed(ConnectionResult result) {
    // Refer to the javadoc for ConnectionResult to see what error codes might be returned in
    // onConnectionFailed.
    Log.i(TAG, "Connection failed: ConnectionResult.getErrorCode() = " + result.getErrorCode());
}


@Override
public void onConnectionSuspended(int cause) {
    // The connection to Google Play services was lost for some reason. We call connect() to
    // attempt to re-establish the connection.
    Log.i(TAG, "Connection suspended");
    mGoogleApiClient.connect();
}

/**
 * Updates the address in the UI.
 */
protected void displayAddressOutput() {
    mLocationAddressTextView.setText(mAddressOutput);
}

/**
 * Toggles the visibility of the progress bar. Enables or disables the Fetch Address button.
 */
private void updateUIWidgets() {
    if (mAddressRequested) {
        mProgressBar.setVisibility(ProgressBar.VISIBLE);
        mFetchAddressButton.setEnabled(false);
    } else {
        mProgressBar.setVisibility(ProgressBar.GONE);
        mFetchAddressButton.setEnabled(true);
    }
}

/**
 * Shows a toast with the given text.
 */
protected void showToast(String text) {
    Toast.makeText(this, text, Toast.LENGTH_SHORT).show();
}

@Override
public void onSaveInstanceState(Bundle savedInstanceState) {
    // Save whether the address has been requested.
    savedInstanceState.putBoolean(ADDRESS_REQUESTED_KEY, mAddressRequested);

    // Save the address string.
    savedInstanceState.putString(LOCATION_ADDRESS_KEY, mAddressOutput);
    super.onSaveInstanceState(savedInstanceState);
}

/**
 * Receiver for data sent from FetchAddressIntentService.
 */
class AddressResultReceiver extends ResultReceiver {
    public AddressResultReceiver(Handler handler) {
        super(handler);
    }

    /**
     *  Receives data sent from FetchAddressIntentService and updates the UI in MainActivity.
     */
    @Override
    protected void onReceiveResult(int resultCode, Bundle resultData) {

        // Display the address string or an error message sent from the intent service.
        mAddressOutput = resultData.getString(Constants.RESULT_DATA_KEY);
        displayAddressOutput();

        // Show a toast message if an address was found.
        if (resultCode == Constants.SUCCESS_RESULT) {
            showToast(getString(R.string.address_found));
        }

        // Reset. Enable the Fetch Address button and stop showing the progress bar.
        mAddressRequested = false;
        updateUIWidgets();
    }
}

}

1 个答案:

答案 0 :(得分:0)

将mAdressRequested从False设置为True, 所以在OnConnected中,可以调用startIntentService

// Set defaults, then update using values stored in the Bundle.
    mAddressRequested = true;
    mAddressOutput = "";
    updateValuesFromBundle(savedInstanceState);