![](/img/trans.png)
[英]Android: How to search for nearby hotels using the Google Places API (Autocomplete)?
[英]How do I implement Google places autocomplete on a search widget in my android app?
我對android開發非常陌生,並且一直在開發應用程序,並遵循開發人員文檔。 我正在嘗試將具有自動完成功能的Google Places API集成到我的應用中。 基本上,我已經集成了地圖片段和搜索小部件。 我堅持嘗試集成代碼以在每次輸入字母時提供位置列表。
index.java
package com.connortlee.justspace;
import android.app.Activity;
import android.app.SearchManager;
import android.content.Context;
import android.location.Location;
import android.location.LocationManager;
import android.location.LocationListener;
import android.os.Bundle;
import android.util.Log;
import android.view.Menu;
import android.view.MenuItem;
import android.view.Window;
import android.view.inputmethod.InputMethodManager;
import android.widget.EditText;
import android.widget.LinearLayout;
import android.widget.SearchView;
import android.widget.TextView;
import android.widget.Toast;
import android.content.Intent;
import android.app.Dialog;
import android.support.v4.app.DialogFragment;
import android.content.IntentSender;
import android.widget.TextView.OnEditorActionListener;
import android.view.KeyEvent;
import android.view.inputmethod.EditorInfo;
import com.google.android.gms.common.ConnectionResult;
import com.google.android.gms.common.GooglePlayServicesClient;
import com.google.android.gms.common.GooglePlayServicesUtil;
import com.google.android.gms.location.LocationClient;
import com.google.android.gms.maps.CameraUpdate;
import com.google.android.gms.maps.CameraUpdateFactory;
import com.google.android.gms.maps.GoogleMap;
import com.google.android.gms.maps.MapFragment;
import com.google.android.gms.maps.model.LatLng;
import com.google.android.gms.maps.model.MarkerOptions;
public class index extends Activity implements LocationListener,
GooglePlayServicesClient.ConnectionCallbacks,
GooglePlayServicesClient.OnConnectionFailedListener {
private GoogleMap googleMap;
protected LatLng currentLocation;
protected LocationManager locationManager;
private LocationClient locationClient;
private final static int CONNECTION_FAILURE_RESOLUTION_REQUEST = 9000;
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
requestWindowFeature(Window.FEATURE_NO_TITLE);
setContentView(R.layout.activity_index);
SearchManager searchManager = (SearchManager) getSystemService(Context.SEARCH_SERVICE);
SearchView searchView = (SearchView) findViewById(R.id.stop);
searchView.setSearchableInfo(searchManager.getSearchableInfo(getComponentName()));
//google map and location services
googleMap = ((MapFragment) getFragmentManager().findFragmentById(R.id.map)).getMap();
googleMap.setMapType(GoogleMap.MAP_TYPE_NORMAL);
googleMap.getUiSettings().setZoomControlsEnabled(false);
locationManager = (LocationManager) getSystemService(Context.LOCATION_SERVICE);
if (locationManager.isProviderEnabled(LocationManager.GPS_PROVIDER)) {
locationManager.requestLocationUpdates(LocationManager.GPS_PROVIDER, 100, 1000, this);
} else {
locationManager.requestLocationUpdates(LocationManager.NETWORK_PROVIDER, 100, 1000, this);
}
}
public boolean onKeyDown(int keyCode, KeyEvent event) {
final SearchView stop = (SearchView) findViewById(R.id.stop);
if ((keyCode == KeyEvent.KEYCODE_BACK)) {
stop.clearFocus();
}
return super.onKeyDown(keyCode, event);
}
private void getLocationClient() {
if (locationClient == null) {
locationClient = new LocationClient(this, this, this);
}
}
@Override
protected void onStart() {
super.onStart();
setUpMapIfNeeded();
if (servicesConnected()) {
getLocationClient();
locationClient.connect();
}
}
@Override
protected void onStop() {
locationClient.disconnect();
super.onStop();
}
@Override
public void onLocationChanged(Location location) {
currentLocation = new LatLng(location.getLatitude(), location.getLongitude());
CameraUpdate cameraUpdate = CameraUpdateFactory.newLatLngZoom(currentLocation, 15);
googleMap.animateCamera(cameraUpdate);
locationManager.removeUpdates(this);
}
@Override
public void onStatusChanged(String s, int i, Bundle bundle) {
Log.d("Latitude", "status");
}
public void onProviderEnabled(String provider) {
Log.d("Latitude", "enable");
}
@Override
public void onProviderDisabled(String s) {
Log.d("Latitude", "disable");
}
public boolean onCreateOptionsMenu(Menu menu) {
getMenuInflater().inflate(R.menu.index, menu);
// Get the SearchView and set the searchable configuration
SearchManager searchManager = (SearchManager) getSystemService(Context.SEARCH_SERVICE);
SearchView searchView = (SearchView) menu.findItem(R.id.search).getActionView();
searchView.setSearchableInfo(searchManager.getSearchableInfo(getComponentName()));
return true;
}
@Override
public boolean onOptionsItemSelected(MenuItem item) {
// Handle action bar item clicks here. The action bar will
// automatically handle clicks on the Home/Up button, so long
// as you specify a parent activity in AndroidManifest.xml.
int id = item.getItemId();
if (id == R.id.action_settings) {
return true;
}
return super.onOptionsItemSelected(item);
}
private void setUpMapIfNeeded() {
if (googleMap == null) {
googleMap = ((MapFragment) getFragmentManager().findFragmentById(R.id.map)).getMap();
}
}
/*
* Define a request code to send to Google Play services
* This code is returned in Activity.onActivityResult
*/
public boolean servicesConnected() {
int errorCode = GooglePlayServicesUtil.isGooglePlayServicesAvailable(this);
if (errorCode != ConnectionResult.SUCCESS) {
GooglePlayServicesUtil.getErrorDialog(errorCode, this, 0).show();
return false;
}
return true;
}
/*
* Called by Location Services when the request to connect the
* client finishes successfully. At this point, you can
* request the current location or start periodic updates
*/
@Override
public void onConnected(Bundle dataBundle) {
// Display the connection status
Toast.makeText(this, "Connected", Toast.LENGTH_SHORT).show();
}
/*
* Called by Location Services if the connection to the
* location client drops because of an error.
*/
@Override
public void onDisconnected() {
// Display the connection status
Toast.makeText(this, "Disconnected. Please re-connect.",
Toast.LENGTH_SHORT).show();
}
/*
* Called by Location Services if the attempt to
* Location Services fails.
*/
@Override
public void onConnectionFailed(ConnectionResult connectionResult) {
/*
* Google Play services can resolve some errors it detects.
* If the error has a resolution, try sending an Intent to
* start a Google Play services activity that can resolve
* error.
*/
if (connectionResult.hasResolution()) {
try {
// Start an Activity that tries to resolve the error
connectionResult.startResolutionForResult(this, CONNECTION_FAILURE_RESOLUTION_REQUEST);
/*
* Thrown if Google Play services canceled the original
* PendingIntent
*/
} catch (IntentSender.SendIntentException e) {
// Log the error
e.printStackTrace();
}
} else {
/*
* If no resolution is available, display a dialog to the
* user with the error.
*/
Toast.makeText(getApplicationContext(), "Sorry. Location services not available.", Toast.LENGTH_LONG).show();
}
}
}
searchableActivity.java
package com.connortlee.justspace;
import android.app.ListActivity;
import android.app.SearchManager;
import android.content.Intent;
import android.os.Bundle;
import android.util.Log;
public class SearchableActivity extends ListActivity {
private static final String LOG_TAG = "locationAlarm";
private static final String PLACES_API_BASE = "https://maps.googleapis.com/maps/api/place";
private static final String TYPE_AUTOCOMPLETE = "/autocomplete";
private static final String OUT_JSON = "/json";
private static final String API_KEY = "AIzaSyAjtXXyZsECNNewDVAHKiN4QHIEZLWvW3g";
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_index);
// Get the intent, verify the action and get the query
Intent intent = getIntent();
if (Intent.ACTION_SEARCH.equals(intent.getAction())) {
String query = intent.getStringExtra(SearchManager.QUERY);
doMySearch(query);
}
}
private void doMySearch(String query) {
Log.d("Event", query);
}
}
我對android開發來說還很新,所以正確方向的指針會有所幫助。 謝謝!
Windwaker的庫在Java方面看起來很棒。 如果您想嘗試一個為Android提供GooglePlaceAutoComplete
小部件的庫,可以看看Sprockets (我是開發人員)。
使用您的Google API密鑰配置庫之后,您可以將GooglePlaceAutoComplete元素添加到布局中。 例如:
<net.sf.sprockets.widget.GooglePlaceAutoComplete
android:id="@+id/place"
android:layout_width="match_parent"
android:layout_height="wrap_content"/>
然后你就可以得到的地方 ,用戶選擇通過設置OnPlaceClickListener 。
public void onPlaceClick(AdapterView<?> parent, Prediction place, int position) {
/* do something with the Place */
}
為此,我實際上使用Java創建了一個庫。 它基本上是Google Places API的包裝,並且功能齊全。 為了使用該庫,您必須具有Google Places API密鑰。 ( 說明 )
您可以使用該庫接收自動完成預測,如下所示:
GooglePlaces client = new GooglePlaces("YOUR_API_KEY_HERE");
List<Place> places = client.getQueryPredictions(query);
或按地名加上:
List<Place> places = client.getPlacePrediction(placeName);
確保您不在主線程上執行這些操作!
希望這可以幫助!
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.