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

如何处理 Google Map Direction API 中的 0,0 标记错误?

google map api结果中的id和place id有啥区别?