Los espacios no funcionan cuando se utiliza la API de autocompletar de Google Places

Cuando escribo un espacio en mi aplicación para Android, ya no obtengo resultados en mi menú desplegable. ¿Cómo puedo arreglar esto? Estoy codificando la entrada por lo que no estoy seguro de por qué no está funcionando …

Antes del Espacio: Introduzca aquí la descripción de la imagen

Después del Espacio: Introduzca aquí la descripción de la imagen

He buscado https://developers.google.com/places/documentation/autocomplete pero no he encontrado nada que me ayude.

import java.io.BufferedReader; import java.io.IOException; import java.io.InputStream; import java.io.InputStreamReader; import java.io.UnsupportedEncodingException; import java.net.HttpURLConnection; import java.net.URL; import java.net.URLEncoder; import java.util.HashMap; import java.util.List; import org.json.JSONObject; import android.app.Activity; import android.os.AsyncTask; import android.os.Bundle; import android.text.Editable; import android.text.TextWatcher; import android.util.Log; import android.view.Menu; import android.widget.AutoCompleteTextView; import android.widget.SimpleAdapter; public class MainActivity extends Activity { AutoCompleteTextView atvPlaces; PlacesTask placesTask; ParserTask parserTask; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.main); atvPlaces = (AutoCompleteTextView) findViewById(R.id.atv_places); atvPlaces.setThreshold(1); atvPlaces.addTextChangedListener(new TextWatcher() { @Override public void onTextChanged(CharSequence s, int start, int before, int count) { placesTask = new PlacesTask(); placesTask.execute(s.toString()); } @Override public void beforeTextChanged(CharSequence s, int start, int count, int after) { // TODO Auto-generated method stub } @Override public void afterTextChanged(Editable s) { // TODO Auto-generated method stub } }); } /** A method to download json data from url */ private String downloadUrl(String strUrl) throws IOException{ String data = ""; InputStream iStream = null; HttpURLConnection urlConnection = null; try{ URL url = new URL(strUrl); // Creating an http connection to communicate with url urlConnection = (HttpURLConnection) url.openConnection(); // Connecting to url urlConnection.connect(); // Reading data from url iStream = urlConnection.getInputStream(); BufferedReader br = new BufferedReader(new InputStreamReader(iStream)); StringBuffer sb = new StringBuffer(); String line = ""; while( ( line = br.readLine()) != null){ sb.append(line); } data = sb.toString(); br.close(); }catch(Exception e){ Log.d("Exception while downloading url", e.toString()); }finally{ iStream.close(); urlConnection.disconnect(); } return data; } // Fetches all places from GooglePlaces AutoComplete Web Service private class PlacesTask extends AsyncTask<String, Void, String>{ @Override protected String doInBackground(String... place) { // For storing data from web service String data = ""; // Obtain browser key from https://code.google.com/apis/console String key = "key=AIzaSyDcXFSC2I6ZqxQeAbUMFvJKMrA98217H9U"; String input=""; try { input = "input=" + URLEncoder.encode(place[0], "utf-8"); } catch (UnsupportedEncodingException e1) { e1.printStackTrace(); } // place type to be searched String types = "types=(regions)"; // Sensor enabled String sensor = "sensor=false"; // Building the parameters to the web service String parameters = input+"&"+types+"&"+sensor+"&"+key; // Output format String output = "json"; // Building the url to the web service String url = "https://maps.googleapis.com/maps/api/place/autocomplete/"+output+"?"+parameters; try{ // Fetching the data from we service data = downloadUrl(url); }catch(Exception e){ Log.d("Background Task",e.toString()); } return data; } @Override protected void onPostExecute(String result) { super.onPostExecute(result); // Creating ParserTask parserTask = new ParserTask(); // Starting Parsing the JSON string returned by Web Service parserTask.execute(result); } } /** A class to parse the Google Places in JSON format */ private class ParserTask extends AsyncTask<String, Integer, List<HashMap<String,String>>>{ JSONObject jObject; @Override protected List<HashMap<String, String>> doInBackground(String... jsonData) { List<HashMap<String, String>> places = null; PlaceJSONParser placeJsonParser = new PlaceJSONParser(); try{ jObject = new JSONObject(jsonData[0]); // Getting the parsed data as a List construct places = placeJsonParser.parse(jObject); }catch(Exception e){ Log.d("Exception",e.toString()); } return places; } @Override protected void onPostExecute(List<HashMap<String, String>> result) { String[] from = new String[] { "description"}; int[] to = new int[] { android.R.id.text1 }; // Creating a SimpleAdapter for the AutoCompleteTextView SimpleAdapter adapter = new SimpleAdapter(getBaseContext(), result, android.R.layout.simple_list_item_1, from, to); // Setting the adapter atvPlaces.setAdapter(adapter); } } @Override public boolean onCreateOptionsMenu(Menu menu) { // Inflate the menu; this adds items to the action bar if it is present. getMenuInflater().inflate(R.menu.main, menu); return true; } } 

Trate de añadir

 adapter.notifyDataSetChanged(); 

después

 atvPlaces.setAdapter(adapter); 

Acabo de experimentar con algunos resultados de búsqueda:

https://maps.googleapis.com/maps/api/place/autocomplete/json?input=123+43+Sweden&types=%28regions%29&sensor=false&key=AIzaSyDcXFSC2I6ZqxQeAbUMFvJKMrA98217H9U

Es posible que la codificación de URL no codifique adecuadamente el espacio. Si usted tiene algo como "123 +" en el obtener que debe producir resultados válidos como se ve arriba. En su lugar, necesita realizar una sustitución para intercambiar espacios por + 's.

 input=input.replace(" ","+"); 

Pruebe que después de su URLEncoder para mantener la codificación, pero eliminar cualquier riesgo de la + se codifica.

HTH

Tratar "." En lugar de espacio. Debe reemplazar el espacio con punto (.), Si no funciona Debería intentar "\" como en ubuntu. Puede ser útil

Intenta reemplazar esta línea

  input = "input=" + URLEncoder.encode(place[0], "utf-8"); 

por

  input = "input=" + URLEncoder.encode(place[0]); 

Me encanta una solución no hay nada malo con TextWatcher ().

Necesidad de utilizar debajo del código En debajo del código no anularé el método "performFiltering" Lo agregué y mi caja completa del texto del auto ahora que trabaja muy bien.

Public class CustomAutoCompleteView extends AutoCompleteTextView {

 public CustomAutoCompleteView(Context context) { super(context); // TODO Auto-generated constructor stub } public CustomAutoCompleteView(Context context, AttributeSet attrs) { super(context, attrs); // TODO Auto-generated constructor stub } public CustomAutoCompleteView(Context context, AttributeSet attrs, int defStyle) { super(context, attrs, defStyle); // TODO Auto-generated constructor stub } @Override protected void performFiltering(final CharSequence text, final int keyCode) { String filterText = ""; super.performFiltering(filterText, keyCode); } /** * After a selection, capture the new value and append to the existing * text */ @Override protected void replaceText(final CharSequence text) { super.replaceText(text); } 

}

  • Selección de la API de Google Places sólo determinados tipos de lugares
  • Android PlacePicker se cierra 2 segundos después del lanzamiento
  • Google Place Selector en Android - área límite / radio
  • Android: acceso a ubicaciones google guardadas mediante programación
  • No se puede importar Google Places PlacePicker en el proyecto de Android
  • Cómo configurar "Tipos" en Google Place PlacePicker en Android?
  • PlaceAutoCompleteFragment en android no muestra sugerencias y se cierra después de ingresar la primera letra
  • Código postal / código postal de android lugar objeto
  • Cómo cambiar el tamaño del texto en lugares autocompletefragment en android?
  • API de sitios para Android: obtenga las líneas de addres de Place.getAddress ()
  • Android: ¿por qué google lugares api volver lugares en otros países, incluso cuando los límites es de 500 metros?
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.