我跟隨this tutorial一起關於如何使用Google Places API和Android中的自動完成功能。創建Json請求並獲取Json對象
獲取預測的描述並將它們存儲在數組中,以便在用戶輸入字符串時顯示。
private ArrayList<String> autocomplete(String input) {
ArrayList<String> resultList = null;
HttpURLConnection conn = null;
StringBuilder jsonResults = new StringBuilder();
try {
URL mUrl = new URL(PLACES_API_BASE +
TYPE_AUTOCOMPLETE +
OUT_JSON +
"?sensor=false&key=" +
API_KEY +
"&components=country:us" +
"&input=" +
URLEncoder.encode(input, "utf8"));
conn = (HttpURLConnection) mUrl.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 null;
} catch (IOException e) {
Log.e(LOG_TAG, "Error connecting to Places API", e);
return null;
} finally {
if (conn != null) {
conn.disconnect();
}
}
try {
// Create a JSON object hierarchy from the results
JSONObject jsonObj = new JSONObject(jsonResults.toString());
mPredictionsJsonArray = jsonObj.getJSONArray("predictions");
// Extract the Place descriptions from the results
resultList = new ArrayList<String>(mPredictionsJsonArray.length());
for (int i = 0; i < mPredictionsJsonArray.length(); i++) {
resultList.add(mPredictionsJsonArray.getJSONObject(i).getString("description"));
}
} catch (JSONException e) {
Log.e(LOG_TAG, "Error processing Places API URL", e);
} finally {
if (conn != null) {
conn.disconnect();
}
}
return resultList;
}
然後,當用戶點擊建議時,
@Override
public void onItemClick(AdapterView<?> adapterView, View view, int position, long l) {
//String reference = "https://maps.googleapis.com/maps/api/place/details/json?reference=";
//String photo = "https://maps.googleapis.com/maps/api/place/photo?maxwidth=70&photoreference=";
try {
REFERENCE = mPredictionsJsonArray.getJSONObject(position).getString("reference");
} catch (JSONException e) {
Log.e(LOG_TAG, "Error processing Places API URL", e);
}
HttpURLConnection conn = null;
StringBuilder jsonResults = new StringBuilder();
try {
REFERENCE = mPredictionsJsonArray.getJSONObject(position).getString("reference");
} catch (JSONException e) {
Log.e(LOG_TAG, "Error processing Places API URL", e);
}
try {
URL mUrl = new URL("https://maps.googleapis.com/maps/api/place/details/json?reference=" +
REFERENCE +
"?sensor=false&key=" +
API_KEY);
conn = (HttpURLConnection) mUrl.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);
} catch (IOException e) {
Log.e(LOG_TAG, "Error connecting to Places API", e);
} finally {
if (conn != null) {
conn.disconnect();
}
}
}
logcat的
02-18 10:59:27.775 2081-2081/com.example.project.thisthat E/AndroidRuntime﹕ FATAL EXCEPTION: main
Process: com.example.project.thisthat, PID: 2081
android.os.NetworkOnMainThreadException
at android.os.StrictMode$AndroidBlockGuardPolicy.onNetwork(StrictMode.java:1145)
at com.android.org.conscrypt.OpenSSLSocketImpl.close(OpenSSLSocketImpl.java:1009)
at com.android.okhttp.Connection.close(Connection.java:175)
at com.android.okhttp.internal.Util.closeQuietly(Util.java:110)
at com.android.okhttp.internal.http.HttpEngine.release(HttpEngine.java:447)
at com.android.okhttp.internal.http.HttpURLConnectionImpl.disconnect(HttpURLConnectionImpl.java:104)
at com.android.okhttp.internal.http.HttpsURLConnectionImpl.disconnect(HttpsURLConnectionImpl.java:124)
at com.example.project.thisthat.PollActivity.onItemClick(PollActivity.java:175)
at android.widget.AutoCompleteTextView.performCompletion(AutoCompleteTextView.java:902)
at android.widget.AutoCompleteTextView.access$500(AutoCompleteTextView.java:91)
at android.widget.AutoCompleteTextView$DropDownItemClickListener.onItemClick(AutoCompleteTextView.java:1192)
at android.widget.AdapterView.performItemClick(AdapterView.java:299)
at android.widget.AbsListView.performItemClick(AbsListView.java:1113)
at android.widget.AbsListView$PerformClick.run(AbsListView.java:2904)
at android.widget.AbsListView$3.run(AbsListView.java:3638)
at android.os.Handler.handleCallback(Handler.java:733)
at android.os.Handler.dispatchMessage(Handler.java:95)
at android.os.Looper.loop(Looper.java:136)
at android.app.ActivityThread.main(ActivityThread.java:5017)
at java.lang.reflect.Method.invokeNative(Native Method)
at java.lang.reflect.Method.invoke(Method.java:515)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:779)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:595)
at dalvik.system.NativeStart.main(Native Method)
我能獲得所選項目的參考數字,但是,當我試圖複製上面的代碼中onItemClick()
功能,我得到一個致命錯誤並且申請部隊關閉。 我試圖最終獲取所選地點的照片網址。
請共享logcat的結果和代碼,其使用的是內部'onItemClick'調用'autocomplete' –
我想NetworkOnMainThreadException) –
@ρяσѕρєяK更新與完整的代碼和logcat –