0

Я впервые использую API Google Адресов на Android, потому что мне нужен AutoCompleteTextView, который предлагает места, когда пользователь набирает на нем. Итак, я активировал API Google Адресов, и я создал ключ API, ключ браузера, как говорится в некоторых уроках. Когда я запускаю приложение и набираю что-то в AutoCompleteTextView, статус в json-файле «INVALID_REQUEST», и я не понимаю, почему. Я прочитал некоторые ответы на подобные вопросы, но это не было полезно для меня ...
Вот код (я использую фрагмент)API Google Places возвращает INVALID_REQUEST (Android)

onCreateView()

@Override 
    public View onCreateView(LayoutInflater inflater, ViewGroup container, 
          Bundle savedInstanceState) { 
     View v = inflater.inflate(R.layout.fragment_postcard_back, container, false); 
     Context c = getActivity().getApplicationContext(); 
     AutoCompleteTextView autoCompView = (AutoCompleteTextView) v.findViewById(R.id.postcard_location_autocomplete); 
     autoCompView.setAdapter(new PlacesAutoCompleteAdapter(c, R.layout.view_place_list_item)); 
     autoCompView.setOnItemClickListener(this); 

     return v; 
    } 

адаптер PlacesAutoCompleteAdapter

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; 
     } 
    } 

автополный метод

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("?key=" + API_KEY); 
      sb.append("&components;=country:uk"); 
      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<String>(predsJsonArray.length()); 
      for (int i = 0; i < predsJsonArray.length(); i++) { 
       resultList.add(predsJsonArray.getJSONObject(i).getString("description")); 
      } 
     } catch (JSONException e) { 
      Log.e(LOG_TAG, "Cannot process JSON results", e); 
     } 

     return resultList; 
    } 

view_place_list_item.xml

<?xml version="1.0" encoding="utf-8"?> 
<TextView xmlns:android="http://schemas.android.com/apk/res/android" 
    android:layout_width="wrap_content" 
    android:layout_height="wrap_content" /> 

КОНСТАНТ

private static final String LOG_TAG = "Google Places Autocomplete"; 

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 = "MY KEY"; 

Конечно, "MY KEY" это мой реальный апи ключ ...

я вставляю здесь скриншот, где вы можете увидеть JsonResult

enter image description here

Спасибо за вашу помощь

ответ

2

С быстрым взглядом строка ;= в строке запроса выглядит неправильно. Вероятно, это должно быть просто =.

Если вы хотите использовать библиотеку, которая содержит вид GooglePlaceAutoComplete, ознакомьтесь с Sprockets (я разработчик). После настройки с помощью ключа API вы можете добавить в свой макет рабочий автозаполнения API Places с чем-то вроде:

<net.sf.sprockets.widget.GooglePlaceAutoComplete 
    android:id="@+id/place" 
    android:layout_width="match_parent" 
    android:layout_height="wrap_content"/> 
+0

Большое спасибо, он отлично работает. Вы были правы, это было просто '='. Кроме того, если кому-то еще нужны все страны, просто опустите эту строку 'sb.append (" & components = country: uk "); –

Смежные вопросы