简体   繁体   English

放置Google Api-自动完成

[英]Places Google Api - Autocomplete

This is a bit weird, I followed the Google places API to add autocomplete for my android app. 这有点奇怪,我按照Google Places API为我的android应用添加了自动填充功能。 Google Places API request denied for Android autocomplete, even with the right api key. 即使使用正确的api键,也无法通过Android自动完成Google Places API请求。 I even tried to check with the JSON Client and requested both GET/POST still same error because I'm sure my code follows the integration for google api autocomplete accordingly. 我什至尝试与JSON客户端进行检查,并请求GET / POST仍然相同的错误,因为我确定我的代码会相应地遵循google api自动完成功能的集成。 I have not found any solution that resolves the error. 我没有找到解决该错误的任何解决方案。 Some answers suggest removing sensor with place_id. 一些答案建议使用place_id删除传感器。 I don't know. 我不知道。 Kindly explain a solution or suggestion that would help me to get the autocomplete working fine. 请解释一个解决方案或建议,以帮助我顺利完成自动填充。

https://maps.googleapis.com/maps/api/place/autocomplete/json/?sensor=false&key=API_KEY&components=country=us&input=california https://maps.googleapis.com/maps/api/place/autocomplete/json/?sensor=false&key=API_KEY&components=country=us&input=california

在此处输入图片说明

Hi brother use like this try this url with your api key: https://maps.googleapis.com/maps/api/place/autocomplete/json?sensor=true&key= api key&language=en&input=kir 嗨,兄弟这样使用,请尝试使用您的api密钥访问此网址: https ://maps.googleapis.com/maps/api/place/autocomplete/json?sensor=true&key = api密钥&language = zh-CN&input = kir

Its working bro. 它的工作兄弟。

It will work in android app only. 它将仅在android应用中工作。 Don't try it in REST client. 不要在REST客户端中尝试。 Instead try debugging your app to see response. 而是尝试调试您的应用以查看响应。

public class PlacesAutoCompleteAdapter extends ArrayAdapter<String> implements
    Filterable {
private ArrayList<MapdataList> resultList;

public PlacesAutoCompleteAdapter(Context context, int textViewResourceId) {
    super(context, textViewResourceId);

}

@Override
public int getCount() {
    return resultList.size();
}

@Override
public String getItem(int index) {

    MapdataList data = resultList.get(index);

    return data.getPlaceName();

}

public String mthod(int index) {
    MapdataList data = resultList.get(index);

    return data.getPlaceID();

}

@Override
public Filter getFilter() {
    Filter filter = new Filter() {
        @Override
        protected FilterResults performFiltering(CharSequence constraint) {
            FilterResults filterResults = new FilterResults();
            if (constraint != null) {
                // Retrieve the autocomplete results.
                resultList = autocomplete(constraint.toString());

                // Assign the data to the FilterResults
                filterResults.values = resultList;
                filterResults.count = resultList.size();
            }
            return filterResults;
        }

        @Override
        protected void publishResults(CharSequence constraint,
                FilterResults results) {
            if (results != null && results.count > 0) {
                notifyDataSetChanged();
            } else {
                notifyDataSetInvalidated();
            }
        }
    };
    return filter;
}

private static final String LOG_TAG = "ExampleApp";
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 = "serverkry";

private ArrayList<MapdataList> autocomplete(String input) {
    ArrayList<MapdataList> resultList = null;

    HttpURLConnection conn = null;
    StringBuilder jsonResults = new StringBuilder();
    try {
        StringBuilder sb = new StringBuilder(PLACES_API_BASE
                + TYPE_AUTOCOMPLETE + OUT_JSON);
        sb.append("?key=" + API_KEY);
        // sb.append("&components=country:uk");
        sb.append("&sensor=true");
        sb.append("&input=" + URLEncoder.encode(input, "utf8"));

        URL url = new URL(sb.toString());
        conn = (HttpURLConnection) url.openConnection();
        InputStreamReader in = new InputStreamReader(conn.getInputStream());

        // Load the results into a StringBuilder
        int read;
        char[] buff = new char[1024];
        while ((read = in.read(buff)) != -1) {
            jsonResults.append(buff, 0, read);
        }
    } catch (MalformedURLException e) {
        Log.e(LOG_TAG, "Error processing Places API URL", e);
        return resultList;
    } catch (IOException e) {
        Log.e(LOG_TAG, "Error connecting to Places API", e);
        return resultList;
    } finally {
        if (conn != null) {
            conn.disconnect();
        }
    }

    try {
        // Create a JSON object hierarchy from the results
        JSONObject jsonObj = new JSONObject(jsonResults.toString());
        JSONArray predsJsonArray = jsonObj.getJSONArray("predictions");

        // Extract the Place descriptions from the results
        resultList = new ArrayList<MapdataList>(predsJsonArray.length());
        for (int i = 0; i < predsJsonArray.length(); i++) {

            MapdataList mapData = new MapdataList();
            mapData.setPlaceName(predsJsonArray.getJSONObject(i).getString(
                    "description"));
            mapData.setPlaceID(predsJsonArray.getJSONObject(i).getString(
                    "place_id"));

            resultList.add(mapData);

            // resultList.add(predsJsonArray.getJSONObject(i).getString(
            // "description"));
            // resultList.add(1,predsJsonArray.getJSONObject(i).getString(
            // "place_id"));
        }
    } catch (JSONException e) {
        Log.e(LOG_TAG, "Cannot process JSON results", e);
    }

    return resultList;
  }
  }

` `

public class TestMapAutocomplete extends Activity {
PlacesAutoCompleteAdapter obj;

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_test_map_autocomplete);

    AutoCompleteTextView YY = (AutoCompleteTextView) findViewById(R.id.Google_autoCompleteTextView1);
    obj = new PlacesAutoCompleteAdapter(this, R.layout.google_list_items);
    YY.setAdapter(obj);

    YY.setOnItemClickListener(getPlaceId);

}

public OnItemClickListener getPlaceId = new OnItemClickListener() {

    @Override
    public void onItemClick(AdapterView<?> parent, View view, int position,
            long id) {
        // TODO Auto-generated method stub

        // int dd= (Integer) parent.getItemAtPosition(position);
        String mcityselect = obj.mthod(position);
        // String mcityselect = (String) parent.getItemAtPosition(position);
        String mcityccselect = (String) parent.getItemAtPosition(position);

    }
};

  }

its working ... do like this create server key and allow all then in android use autoacmpltere Create a server key in google api console and allow all then enable google feture in permissions its working bro try this .... 它的工作...这样做像创建服务器密钥,并允许所有然后在android中使用autoacmpltere在google api控制台中创建服务器密钥,并允许所有用户然后在其功能中启用google feture,请尝试...。

So jaswinder the changes I need to make as I assumed is replace the sensor with place_id and my try catch should also change to look like your code snippet; 因此,jaswinder我需要进行的更改(假设是用place_id替换传感器)和try catch也应更改为看起来像您的代码段;

try {

        // Create a JSON object hierarchy from the results

        JSONObject jsonObj = new JSONObject(jsonResults.toString());

        JSONArray predsJsonArray = jsonObj.getJSONArray("predictions");

        // Extract the Place descriptions from the results

        resultList = new ArrayList<String>(predsJsonArray.length());

        for (int i = 0; i < predsJsonArray.length(); i++) {

            resultList.add(predsJsonArray.getJSONObject(i).getString(

            "description"));

        }

    } catch (JSONException e) {

        Log.e(TAG, "Cannot process JSON results", e);

    }

    return resultList;

Then I can create server key as you explained, I should be good to go then. 然后,我可以按照您的说明创建服务器密钥,然后就可以了。 Thanks 谢谢

Hey guys now the autocomplete is working Jaswinder I just added place_id where you commented it out and wala! it works like a charm.

Hope this code helps someone. 希望这段代码对某人有所帮助。 I used the Key for browser application and enabled both Places api and Goople map api in the console. 我将密钥用于浏览器应用程序,并在控制台中同时启用了Places api和Goople map api。

private class PlacesAutoCompleteAdapter extends ArrayAdapter<String>
        implements Filterable {
    private ArrayList<String> resultList;

    public PlacesAutoCompleteAdapter(Context context, int textViewResourceId) {
        super(context, textViewResourceId);
    }

    @Override
    public int getCount() {
        return resultList.size();
    }

    @Override
    public String getItem(int index) {
        return resultList.get(index);
    }

    @Override
    public Filter getFilter() {
        Filter filter = new Filter() {
            @Override
            protected FilterResults performFiltering(CharSequence constraint) {
                FilterResults filterResults = new FilterResults();
                if (constraint != null) {
                    // Retrieve the autocomplete results.
                    resultList = autocomplete(constraint.toString());

                    // Assign the data to the FilterResults
                    filterResults.values = resultList;
                    filterResults.count = resultList.size();
                }
                return filterResults;
            }

            @Override
            protected void publishResults(CharSequence constraint,
                    FilterResults results) {
                if (results != null && results.count > 0) {
                    notifyDataSetChanged();
                } else {
                    notifyDataSetInvalidated();
                }
            }
        };
        return filter;
    }
}

// Get array list of addresses
private ArrayList<String> autocomplete(String input) {

    ArrayList<String> resultList = null;

    HttpURLConnection conn = null;

    StringBuilder jsonResults = new StringBuilder();

    try {
        StringBuilder sb = new StringBuilder(PLACES_API_BASE
                + TYPE_AUTOCOMPLETE + OUT_JSON);

        sb.append("?sensor=true&key="

        + API_KEY);

        // for current country.Get the country code by SIM

        // If you run this in emulator then it will get country name is
        // "us".

        String cName = getCountryCode();

        if (cName != null) {
            countryName = cName;
        } else {
            countryName = "za";
        }
        sb.append("&components=country:" + countryName);
        sb.append("&input=" + URLEncoder.encode(input, "utf8"));

        URL url = new URL(sb.toString());

        conn = (HttpURLConnection) url.openConnection();

        InputStreamReader in = new InputStreamReader(conn.getInputStream());

        // Load the results into a StringBuilder

        int read;

        char[] buff = new char[1024];

        while ((read = in.read(buff)) != -1) {

            jsonResults.append(buff, 0, read);

        }

    } catch (MalformedURLException e) {

        Log.e(TAG, "Error processing Places API URL", e);

        return resultList;

    } catch (IOException e) {

        Log.e(TAG, "Error connecting to Places API", e);

        return resultList;

    } finally {

        if (conn != null) {

            conn.disconnect();

        }

    }

    try {

        // Create a JSON object hierarchy from the results

        JSONObject jsonObj = new JSONObject(jsonResults.toString());

        JSONArray predsJsonArray = jsonObj.getJSONArray("predictions");

        // Extract the Place descriptions from the results

        resultList = new ArrayList<String>(predsJsonArray.length());

        for (int i = 0; i < predsJsonArray.length(); i++) {

            resultList.add(predsJsonArray.getJSONObject(i).getString(

            "description"));

            resultList.add(predsJsonArray.getJSONObject(i).getString(
                    "place_id"));

        }

    } catch (JSONException e) {

        Log.e(TAG, "Cannot process JSON results", e);

    }

    return resultList;

}

} }

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

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM