[英]How do I implement Google places autocomplete on a search widget in my android app?
I'm pretty new to android development, and I've been making an app and following along on the developer documentation. 我对android开发非常陌生,并且一直在开发应用程序,并遵循开发人员文档。 I am trying to integrate google places api with the autocomplete feature into my app.
我正在尝试将具有自动完成功能的Google Places API集成到我的应用中。 Basically, I have integrated my map fragment and my search widget.
基本上,我已经集成了地图片段和搜索小部件。 I'm stuck on trying to integrate the code to provide a list of places every time a letter is inputted.
我坚持尝试集成代码以在每次输入字母时提供位置列表。
index.java 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 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);
}
}
I'm still pretty new to android development so pointers in the right direction would be helpful. 我对android开发来说还很新,所以正确方向的指针会有所帮助。 Thanks!
谢谢!
Windwaker's library looks great for the Java side. Windwaker的库在Java方面看起来很棒。 If you would like to try a library that provides a
GooglePlaceAutoComplete
widget for Android, you could take a look at Sprockets (I'm the developer). 如果您想尝试一个为Android提供
GooglePlaceAutoComplete
小部件的库,可以看看Sprockets (我是开发人员)。
After the library is configured with your Google API key, you can add a GooglePlaceAutoComplete element to your layout. 使用您的Google API密钥配置库之后,您可以将GooglePlaceAutoComplete元素添加到布局中。 For example:
例如:
<net.sf.sprockets.widget.GooglePlaceAutoComplete
android:id="@+id/place"
android:layout_width="match_parent"
android:layout_height="wrap_content"/>
And then you can get the Place that a user selects by setting an OnPlaceClickListener . 然后你就可以得到的地方 ,用户选择通过设置OnPlaceClickListener 。
public void onPlaceClick(AdapterView<?> parent, Prediction place, int position) {
/* do something with the Place */
}
I actually created a library in Java for this very purpose. 为此,我实际上使用Java创建了一个库。 It's basically a wrapper around Google Places API and is feature-complete.
它基本上是Google Places API的包装,并且功能齐全。 In order to use the library you must have a Google Places API key.
为了使用该库,您必须具有Google Places API密钥。 ( instructions )
( 说明 )
You can receive autocomplete predictions with the library like so: 您可以使用该库接收自动完成预测,如下所示:
GooglePlaces client = new GooglePlaces("YOUR_API_KEY_HERE");
List<Place> places = client.getQueryPredictions(query);
or by place name with: 或按地名加上:
List<Place> places = client.getPlacePrediction(placeName);
Make sure you don't perform these on the main thread! 确保您不在主线程上执行这些操作!
Hope this helps! 希望这可以帮助!
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.