我对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开发还很陌生,所以指向正确方向的指针会有所帮助。谢谢!
答案 0 :(得分:2)
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"/>
然后,您可以通过设置Place来获取用户选择的OnPlaceClickListener。
public void onPlaceClick(AdapterView<?> parent, Prediction place, int position) {
/* do something with the Place */
}
答案 1 :(得分:0)
我实际上是为了这个目的在Java中创建了一个库。它基本上是Google Places API的包装器,功能齐全。要使用该库,您必须拥有Google Places API密钥。 (instructions)
您可以通过以下方式接收自动填充预测:
GooglePlaces client = new GooglePlaces("YOUR_API_KEY_HERE");
List<Place> places = client.getQueryPredictions(query);
或地名:
List<Place> places = client.getPlacePrediction(placeName);
确保您不在主线程上执行这些操作!
希望这有帮助!