简体   繁体   English

如何在我的Android应用中的搜索小部件上实现Google Places自动完成功能?

[英]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! 确保您不在主线程上执行这些操作!

Library on GitHub GitHub上的库

Documentation 文档

Hope this helps! 希望这可以帮助!

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

相关问题 Android:如何使用Google Places API(自动填充)搜索附近的酒店? - Android: How to search for nearby hotels using the Google Places API (Autocomplete)? 如何以编程方式实现谷歌地点自动完成 - How to implement google places autocomplete programmatically Google地方搜索框在我的android应用中消失了,是我的代码吗? - Google places search box disappear in my android app, is it my code? 如何在Android Studio中的应用中实施Google Play游戏服务? - How do I implement Google Play Game services in my app in Android Studio? 如何在Android中为Google Places使用自动完成功能 - How to use Autocomplete for google places in android 如何在 Android Studio 中实现对 Google map 有限位置中包含的地点的搜索 - How to implement the search for places included in a limited location on Google map in Android Studio 如何使用 Google Places Autocomplete 获取位置的完整地址? - How do I get the full address of location using Google Places Autocomplete? 在Google Places API中将自动完成搜索限制为“印度” - Restrict Autocomplete search to “India” in Google Places API 如何在地图框导航应用(android)中添加地方插件? - How do I add the places plugin in the mapbox navigation app (android)? 如何在我的 Android pdf 阅读器应用程序中实现搜索 function? - How to implement a search function in my Android pdf reader app?
 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM