gpt4 book ai didi

android - 使用 Google Places Autocomplete API 时空间不起作用

转载 作者:塔克拉玛干 更新时间:2023-11-02 09:02:29 25 4
gpt4 key购买 nike

当我在我的 Android 应用程序中键入一个空格时,我的下拉列表中不再显示任何结果。我怎样才能解决这个问题?我正在对输入进行编码,所以我不确定为什么它不起作用...

空格前: enter image description here

空格后: enter image description here

我看过https://developers.google.com/places/documentation/autocomplete但我还没有找到任何可以帮助我的东西。

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

最佳答案

我刚刚试验了一些搜索结果:

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

URL 编码可能没有正确编码空间。如果您在 get 中有类似“123+”的内容,它应该会产生如上所示的有效结果。相反,您需要进行替换以将空格换成 +。

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

尝试在您的 URLEncoder 之后保留编码,但消除 + 被编码的任何风险。

HTH

关于android - 使用 Google Places Autocomplete API 时空间不起作用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19799836/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com