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:
- Google Places Api ordenar por distancia
- Código de estado de autocompletado de los lugares 9001
- API de Google Places para Android Error: Estado {statusCode = NETWORK_ERROR, resolution = null}
- ¿Cómo obtener 20+ resultados de la API de Google Places?
- Autocompletar texto google lugares api
Después del Espacio:
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; } }
- Retraso al utilizar PlaceAutoComplete sin utilizar Rest API
- Android Place API: PlaceDetectionApi.getCurrentPlace () siempre devuelve ningún resultado
- Restringir el API de autocompletar de lugares a ciudades de un país específico android
- Rendimiento de clase de URL - Invalid_Request with next_page_token
- Android Google Places API, getAutocompletePredictions devuelve el estado 'PLACES_API_ACCESS_NOT_CONFIGURED'
- Dalvik VM error: Excepción encontrada "Javax.xml.namespace.QName.class"
- Cómo obtener una imagen de un lugar de google maps o lugares API
- Creación de un filtro de tipo de lugar para la API de Autocompletar de lugar para Android
Trate de añadir
adapter.notifyDataSetChanged();
después
atvPlaces.setAdapter(adapter);
Acabo de experimentar con algunos resultados de búsqueda:
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); }
}
- Desplazamiento de un HorizontalScrollView haciendo clic en los botones en sus lados
- Cómo escribir / depurar Android.mk para la biblioteca estática NDK?