Google Map Api 中的 PlaceAutoComplete
Posted
技术标签:
【中文标题】Google Map Api 中的 PlaceAutoComplete【英文标题】:PlaceAutoComplete in Google Map Api 【发布时间】:2017-04-03 07:21:44 【问题描述】:我正在构建一个应用程序,它使用谷歌地图 API 来显示用户的当前位置。我通过点击此链接https://developers.google.com/places/android-api/autocomplete#option_1_embed_a_placeautocompletefragment_or_a_supportplaceautocompletefragment
放置了一个用于搜索特定位置的 PlcaeAutoComplete 片段现在的问题是,当我开始输入 PlaceAutoComplete 时,它没有任何提示并自动取消我的搜索。 这是我的主要活动
公共类 MapsActivity 扩展 FragmentActivity 实现 OnlocReceive,OnMapReadyCallback, GoogleMap.OnMapClickListener,/* LocationListener,/ GoogleMap.OnMarkerClickListener/, GoogleApiClient.OnConnectionFailedListener, GoogleApiClient.ConnectionCallbacks*/
private GoogleMap mMap;
Marker m;
public static final String TAG = MapsActivity.class.getSimpleName();
private GoogleApiClient mGoogleApiClient;
private LocationRequest mLocationRequest;
Location location;
int PLACE_AUTOCOMPLETE_REQUEST_CODE = 1;
private final int MY_PERMISSIONS_REQUEST_CODE = 1;
private final static int CONNECTION_FAILURE_RESOLUTION_REQUEST = 9000;
public GoogleApiClient getmGoogleApiClient()
return mGoogleApiClient;
boolean bound = false;
LocationUpdateService locationService;
public ServiceConnection serviceConnection;
Intent serviceIntent;
PlaceAutocompleteFragment autocompleteFragment;
AutocompleteFilter typeFilter;
@Override
protected void onCreate(Bundle savedInstanceState)
super.onCreate(savedInstanceState);
setContentView(R.layout.newlayout);
// Obtain the SupportMapFragment and get notified when the map is ready to be used.
SupportMapFragment mapFragment = (SupportMapFragment) getSupportFragmentManager()
.findFragmentById(R.id.map);
mapFragment.getMapAsync(this);
autocompleteFragment = (PlaceAutocompleteFragment)
getFragmentManager().findFragmentById(R.id.place_autocomplete_fragment);
typeFilter = new AutocompleteFilter.Builder().setTypeFilter(AutocompleteFilter.TYPE_FILTER_ADDRESS).build();
autocompleteFragment.setFilter(typeFilter);
autocompleteFragment.setBoundsBias(new LatLngBounds(
new LatLng(-33.880490, 151.184363),
new LatLng(-33.858754, 151.229596)));
autocompleteFragment.setOnPlaceSelectedListener(new PlaceSelectionListener()
@Override
public void onPlaceSelected(Place place)
// TODO: Get info about the selected place.
Log.i(TAG, "Place: ------------------------>" + place.getName());
Toast.makeText(MapsActivity.this, "place:"+place.getName(), Toast.LENGTH_SHORT).show();
PendingResult<AutocompletePredictionBuffer> result =
Places.GeoDataApi.getAutocompletePredictions(mGoogleApiClient,place.getName().toString(),
null, typeFilter);
@Override
public void onError(Status status)
);
ConnectivityManager connManager = (ConnectivityManager) getSystemService(Context.CONNECTIVITY_SERVICE);
NetworkInfo mWifi = connManager.getNetworkInfo(ConnectivityManager.TYPE_WIFI);
if (!mWifi.isConnected())
builALertMessageNoWifi();
final LocationManager manager = (LocationManager) getSystemService( Context.LOCATION_SERVICE );
if ( !manager.isProviderEnabled( LocationManager.GPS_PROVIDER ) )
buildAlertMessageNoGps();
serviceConnection = new ServiceConnection()
@Override
public void onServiceConnected(ComponentName name, IBinder service)
locationService = ((LocationUpdateService.localBinder)service).getservice();
locationService.passClas-s-refrence(MapsActivity.this);
Toast.makeText(MapsActivity.this, "bound", Toast.LENGTH_SHORT).show();
@Override
public void onServiceDisconnected(ComponentName name)
bound = false;
Toast.makeText(MapsActivity.this, "not_bound", Toast.LENGTH_SHORT).show();
;
if (ActivityCompat.checkSelfPermission(this, android.Manifest.permission.ACCESS_FINE_LOCATION) != PackageManager.PERMISSION_GRANTED && ActivityCompat.checkSelfPermission(this, android.Manifest.permission.ACCESS_COARSE_LOCATION) != PackageManager.PERMISSION_GRANTED)
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M)
Toast.makeText(MapsActivity.this, "req permission", Toast.LENGTH_SHORT).show();
requestPermissions(new String[]android.Manifest.permission.ACCESS_FINE_LOCATION, android.Manifest.permission.ACCESS_COARSE_LOCATION, MY_PERMISSIONS_REQUEST_CODE);
else
// location = LocationServices.FusedLocationApi.getLastLocation(mGoogleApiClient);
serviceIntent = new Intent(MapsActivity.this,LocationUpdateService.class);
startService(serviceIntent);
bound= bindService(serviceIntent,serviceConnection,BIND_AUTO_CREATE);
public void onMapReady(GoogleMap googleMap) mMap = googleMap;
Toast.makeText(MapsActivity.this, "onMapReady", Toast.LENGTH_SHORT).show();
mMap.setMapType(GoogleMap.MAP_TYPE_TERRAIN);
private void handleNewLocation(Location location)
Log.i(TAG, "in handle new location---------------------->.");
Log.d(TAG, location.toString());
double currentLatitude = location.getLatitude();
double currentLongitude = location.getLongitude();
Toast.makeText(MapsActivity.this, "lat:"+currentLatitude+" lang:"+currentLongitude, Toast.LENGTH_SHORT).show();
LatLng latLng = new LatLng(currentLatitude, currentLongitude);
//mMap.addMarker(new MarkerOptions().position(new LatLng(currentLatitude, currentLongitude)).title("Current Location"));
MarkerOptions options = new MarkerOptions()
.position(latLng)
.title("I am here!");
if(m!=null)
m.remove();
m = mMap.addMarker(options);
// mMap.moveCamera(CameraUpdateFactory.newLatLng(latLng));
mMap.animateCamera(CameraUpdateFactory.newLatLngZoom(latLng, 17));
@Override
public void onreceive(Location l)
handleNewLocation(l);
if(serviceIntent!=null && bound==true )
locationService.stopupdates();
stopService(serviceIntent);
Toast.makeText(MapsActivity.this, "stop service", Toast.LENGTH_SHORT).show();
@Override
public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults)
super.onRequestPermissionsResult(requestCode, permissions, grantResults);
if (requestCode == MY_PERMISSIONS_REQUEST_CODE)
if (grantResults[0] == PackageManager.PERMISSION_GRANTED && grantResults[1] == PackageManager.PERMISSION_GRANTED)
Toast.makeText(MapsActivity.this, " granted " + grantResults[0] + "granted2" + grantResults[1], Toast.LENGTH_SHORT).show();
try
// location = LocationServices.FusedLocationApi.getLastLocation(mGoogleApiClient);
Toast.makeText(MapsActivity.this, "in recieve request new location", Toast.LENGTH_SHORT).show();
serviceIntent = new Intent(MapsActivity.this,LocationUpdateService.class);
startService(serviceIntent);
bound = bindService(serviceIntent,serviceConnection,BIND_AUTO_CREATE);
catch (SecurityException e)
@Override
protected void onResume()
Toast.makeText(MapsActivity.this, "on Resume", Toast.LENGTH_SHORT).show();
// stopService(serviceIntent);
super.onResume();
@Override
protected void onDestroy()
if(serviceIntent!=null && bound ==true )
locationService.stopupdates();
stopService(serviceIntent);
// unbindService(serviceConnection);
super.onDestroy();
private void buildAlertMessageNoGps()
final AlertDialog.Builder builder = new AlertDialog.Builder(this);
builder.setMessage("Your GPS seems to be disabled, do you want to enable it?")
.setCancelable(false)
.setPositiveButton("Yes", new DialogInterface.OnClickListener()
public void onClick(@SuppressWarnings("unused") final DialogInterface dialog, @SuppressWarnings("unused") final int id)
startActivity(new Intent(android.provider.Settings.ACTION_LOCATION_SOURCE_SETTINGS));
)
.setNegativeButton("No", new DialogInterface.OnClickListener()
public void onClick(final DialogInterface dialog, @SuppressWarnings("unused") final int id)
dialog.cancel();
);
final AlertDialog alert = builder.create();
alert.show();
private void builALertMessageNoWifi()
final AlertDialog.Builder builder = new AlertDialog.Builder(this);
builder.setMessage("Your WIFI seeems to be disabled, do you want to enable it?")
.setCancelable(false)
.setPositiveButton("Yes", new DialogInterface.OnClickListener()
@Override
public void onClick(DialogInterface dialog, int which)
startActivity(new Intent(Settings.ACTION_WIFI_SETTINGS));
)
.setNegativeButton("No", new DialogInterface.OnClickListener()
@Override
public void onClick(DialogInterface dialog, int which)
dialog.cancel();
);
final AlertDialog alert = builder.create();
alert.show();
【问题讨论】:
【参考方案1】:通常,由于在开发者控制台中启用了错误/不完整的 API,Google PlaceAutoComplete 无法正常工作。因此,请确保启用正确的 API。您应该同时启用适用于 Android 的 Google Place API 和 Google Place API Web Services。此外,请确保您使用的 API 密钥是浏览器密钥。有关地点自动完成的更多信息,请查看此tutorial。
【讨论】:
谢谢!我遇到了 Web 服务 API 的问题。以上是关于Google Map Api 中的 PlaceAutoComplete的主要内容,如果未能解决你的问题,请参考以下文章
Google Map 中的“您已超出此 API 的请求配额”[重复]
如何使用 API 在 google map xamarin iOS 上更新 PIN 中的信息
如何在 Android Google Map API 中管理不在集群中的标记?
将纬度和经度放入距离矩阵,python中的google map API