0

안드로이드에 자동 완성 기능이있는 Google 거리 매트릭스가 포함 된 앱을 만드는 것입니다. 지금까지 저의 연구와 저서를 공부하면서 코드를 작성하는 것은 매우 어렵습니다. 지금까지 내가안드로이드에 자동 완성 기능이있는 Google 거리 매트릭스

https://developers.google.com/maps/documentation/distancematrix/#Introduction

에 갔다와 구글의 방향이 http://www.stackoverflow.com/questions/9142885/geocoder-autocomplete-in-android http://www.stackoverflow.com/questions/6456090/android-google-map-finding-distance/6456161#6456161

http://www.claytical.com/blog/android-dynamic-autocompletion-using-google-places-api을 기록 이러한 모든 링크는 정말 날 이해 도움이되지하고 난 요청의 개념을 이해 할 API 주소로 보내면 JSON이 반환되고 JSON을 "구문 분석"하고 필요한 정보를 추출해야합니다. 이는 필자의 경우 거리입니다. 하지만 내가 얻지 못하는 것은 Google지도 거리 매트릭스로부터 제안이있는 자동 완성을 만드는 방법과 이에 따라 원본과 목적지를 적절하게 보낼 수있는 방법입니다. 정말 실망스럽고 이것이 클레이 털 닷컴 (Claytical.com)에서 얻은 것입니다.

여기 여기의 main.java

package com.example.autocomplete; 

import java.io.BufferedReader; 
import java.io.IOException; 
import java.io.InputStreamReader; 
import java.net.URL; 
import java.net.URLConnection; 
import java.net.URLEncoder; 
import java.util.ArrayList; 

import org.json.JSONArray; 
import org.json.JSONException; 
import org.json.JSONObject; 

import android.app.Activity; 
import android.content.Context; 
import android.os.AsyncTask; 
import android.os.Bundle; 
import android.text.Editable; 
import android.text.TextWatcher; 
import android.util.Log; 
import android.widget.ArrayAdapter; 
import android.widget.AutoCompleteTextView; 

public class Main extends Activity { 
    /** Called when the activity is first created. */ 
public ArrayAdapter<String> adapter; 
public AutoCompleteTextView textview; 
public Object s; 

class GetPlaces extends AsyncTask<String, Void, ArrayList<String>> 
{ 
public ArrayAdapter<String> adapter; 
public AutoCompleteTextView textview; 
Object s; 


@Override 
      // three dots is java for an array of strings 
protected ArrayList<String> doInBackground(String... args) 
{ 

Log.d("gottaGo", "doInBackground"); 

ArrayList<String> predictionsArr = new ArrayList<String>(); 

try 
{ 



     URL googlePlaces = new URL(
     // URLEncoder.encode(url,"UTF-8"); 
       "https://maps.googleapis.com/maps/api/place/autocomplete/json?input="+ URLEncoder.encode(s.toString(), "UTF-8") +"&types=geocode&language=en&sensor=true&key=<yourapikeygoeshere>"); 
     URLConnection tc = googlePlaces.openConnection(); 
     BufferedReader in = new BufferedReader(new InputStreamReader(
       tc.getInputStream())); 

     String line; 
     StringBuffer sb = new StringBuffer(); 
         //take Google's legible JSON and turn it into one big string. 
     while ((line = in.readLine()) != null) { 
     sb.append(line); 
     } 
         //turn that string into a JSON object 
     JSONObject predictions = new JSONObject(sb.toString()); 
         //now get the JSON array that's inside that object    
     JSONArray ja = new JSONArray(predictions.getString("predictions")); 

      for (int i = 0; i < ja.length(); i++) { 
       JSONObject jo = (JSONObject) ja.get(i); 
           //add each entry to our array 
       predictionsArr.add(jo.getString("description")); 
      } 
} catch (IOException e) 
{ 

Log.e("YourApp", "GetPlaces : doInBackground", e); 

} catch (JSONException e) 
{ 

Log.e("YourApp", "GetPlaces : doInBackground", e); 

} 

return predictionsArr; 

} 

//then our post 

@Override 
protected void onPostExecute(ArrayList<String> result) 
{ 

Log.d("YourApp", "onPostExecute : " + result.size()); 
//update the adapter 
ArrayAdapter<String> adapter = new ArrayAdapter<String>(getBaseContext(),     R.layout.item_list); 
adapter.setNotifyOnChange(true); 

//attach the adapter to textview 
textview.setAdapter(adapter); 

for (String string : result) 
{ 

Log.d("YourApp", "onPostExecute : result = " + string); 
adapter.add(string); 
adapter.notifyDataSetChanged(); 

} 

Log.d("YourApp", "onPostExecute : autoCompleteAdapter" + adapter.getCount()); 

} 

private Context getBaseContext() { 
// TODO Auto-generated method stub 
return null; 
} 

} 

@Override 
public void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.main); 
    final ArrayAdapter<String> adapter = new ArrayAdapter<String>(this,R.layout.item_list); 
    final AutoCompleteTextView textView = (AutoCompleteTextView) 
      findViewById(R.id.autoCompleteTextView1); 
    adapter.setNotifyOnChange(true); 
    textView.setAdapter(adapter); 
    textView.addTextChangedListener(new TextWatcher() { 

public void onTextChanged(CharSequence s, int start, int before, int count) { 
if (count%3 == 1) { 
adapter.clear(); 
      GetPlaces task = new GetPlaces(); 
        //now pass the argument in the textview to the task 
          task.execute(textView.getText().toString()); 
    } 
} 

public void beforeTextChanged(CharSequence s, int start, int count, 
int after) { 
// TODO Auto-generated method stub 

} 

public void afterTextChanged(Editable s) { 

} 
}); 






} 
} 

내 main.xml에

<RelativeLayout 
    xmlns:android="http://schemas.android.com/apk/res/android" 
    android:layout_width="fill_parent" 
    android:layout_height="fill_parent" 
    android:background="#dddddd"> 

<AutoCompleteTextView 
    android:id="@+id/autoCompleteTextView1" 
    android:layout_height="wrap_content" 
    android:layout_width="fill_parent" 
    android:layout_marginTop="10dp" > 

    <requestFocus></requestFocus> 
</AutoCompleteTextView> 

마지막에게의 요청에 따라 로그 캣입니다.

05-14 17:41:38.163: E/Trace(1390): error opening trace file: No such file or directory (2) 
05-14 17:41:39.323: D/gralloc_goldfish(1390): Emulator without GPU emulation detected. 
05-14 17:41:45.284: D/gottaGo(1390): doInBackground 
05-14 17:41:45.296: W/dalvikvm(1390): threadid=11: thread exiting with uncaught exception (group=0x40a13300) 
05-14 17:41:45.314: E/AndroidRuntime(1390): FATAL EXCEPTION: AsyncTask #1 
05-14 17:41:45.314: E/AndroidRuntime(1390): java.lang.RuntimeException: An error occured while executing doInBackground() 
05-14 17:41:45.314: E/AndroidRuntime(1390):  at android.os.AsyncTask$3.done(AsyncTask.java:299) 
05-14 17:41:45.314: E/AndroidRuntime(1390):  at java.util.concurrent.FutureTask$Sync.innerSetException(FutureTask.java:273) 
05-14 17:41:45.314: E/AndroidRuntime(1390):  at java.util.concurrent.FutureTask.setException(FutureTask.java:124) 
05-14 17:41:45.314: E/AndroidRuntime(1390):  at java.util.concurrent.FutureTask$Sync.innerRun(FutureTask.java:307) 
05-14 17:41:45.314: E/AndroidRuntime(1390):  at java.util.concurrent.FutureTask.run(FutureTask.java:137) 
05-14 17:41:45.314: E/AndroidRuntime(1390):  at android.os.AsyncTask$SerialExecutor$1.run(AsyncTask.java:230) 
05-14 17:41:45.314: E/AndroidRuntime(1390):  at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1076) 
05-14 17:41:45.314: E/AndroidRuntime(1390):  at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:569) 
05-14 17:41:45.314: E/AndroidRuntime(1390):  at java.lang.Thread.run(Thread.java:856) 
05-14 17:41:45.314: E/AndroidRuntime(1390): Caused by: java.lang.NullPointerException 
05-14 17:41:45.314: E/AndroidRuntime(1390):  at com.example.autocomplete.Main$GetPlaces.doInBackground(Main.java:54) 
05-14 17:41:45.314: E/AndroidRuntime(1390):  at com.example.autocomplete.Main$GetPlaces.doInBackground(Main.java:1) 
05-14 17:41:45.314: E/AndroidRuntime(1390):  at android.os.AsyncTask$2.call(AsyncTask.java:287) 
05-14 17:41:45.314: E/AndroidRuntime(1390):  at java.util.concurrent.FutureTask$Sync.innerRun(FutureTask.java:305) 
05-14 17:41:45.314: E/AndroidRuntime(1390):  ... 5 more 
05-14 17:41:47.584: I/Choreographer(1390): Skipped 31 frames! The application may be doing too much work on its main thread. 
05-14 17:41:47.904: I/Process(1390): Sending signal. PID: 1390 SIG: 9 

그것은 잘 시작하고 그것은 자동 완성 텍스트 뷰를 제공하지만 최대한 빨리 편지를 입력 할 때, 그것은 충돌합니다. 지금까지 읽어 주셔서 감사합니다. 미리 도움을 주셔서 감사합니다.

+0

충돌이 발생하면 logcat을 게시 할 수 있습니까? – chopchop

+0

logcat을 보여주기 위해 편집 됨 : – user1893343

답변

0

확인을 먼저 할 일은 당신의 URL 형식이 잘못이라는 것이다 :

https://maps.googleapis.com/maps/api/place/autocomplete/json?input=" + URLEncoder.encode(s.toString(), "UTF-8") + "&types=geocode&language=en&sensor=true&key=<yourapikeygoeshere> 

당신은이 일을 위해 API 키를 <yourapikeygoeshere>를 교체해야합니다. 다음은 JSON 배열을 만드는 방법입니다. 당신이 시도하고 나를 어떻게되는지 알려

JSONObject jo = ja.getJSONObject(i); 

JSONObject jo = (JSONObject) ja.get(i); 

을 대체 루프에서

JSONArray ja = new JSONArray(predictions.getJSONArray("predictions")); 

다음과

JSONArray ja = new JSONArray(predictions.getString("predictions")); 

를 교체해야합니다.

+0

API 키를 넣고 나에게 말한 부분을 바꿨지 만 내가했을 때 eclipse가 JSONArray에서 예상치를 제거하라는 제안을 한 후, JSONObject 예측을 제거하려면 = new JSONObject (sb.toString()); \t. – user1893343

0

나는 또한 개발 중에 자동 완성 텍스트 뷰를 디자인 할 때 동일한 코드를 사용하여 동일한 문제에 직면하고 마침내 해결했습니다.

Google 콘솔에서 'Android 용 Google 장소 API'와 '웹 장소 API'를 모두 사용하도록 설정해야합니다.

또한 URLEncoder.encode (s.URLEncoder.encode (args [0] .toString(), "UTF-8")를 사용하여 toString(), "UTF-8")

이 정보가 도움이되기를 바랍니다.