0

私は、ヘッダーが言っていることをやろうとしています。つまり、アンドロイドでオートコンプリートを使用して、Google 距離マトリックスを使用してアプリを作成します。これまでのところ、自分で本を調べたり勉強したりしても、コードを思いつくのは非常に難しく、ようやくここにたどり着きました。これまで行ってきた

https://developers.google.com/maps/documentation/distancematrix/#はじめに

Google ルート案内ドキュメント

http://www.claytical.com/blog/android-dynamic-autocompletion-using-google-places-api http://www.stackoverflow.com/questions/9142885/geocoder-autocomplete-in-android http:// www.stackoverflow.com/questions/6456090/android-google-map-finding-distance/6456161#6456161

これらすべてのリンクは、私がそれを理解するのに実際には役に立ちませんでした.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>

最後に、要求された LOGCAT を次に示します。

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

問題なく起動し、オートコンプリートのテキストビューが表示されますが、文字を入力するとすぐにクラッシュします。ここまでお読みいただき、ありがとうございました。

4

2 に答える 2

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>

<yourapikeygoeshere>機能させるには、API キーに置き換える必要があります。次は、JSON 配列を作成する方法です。交換する必要があります

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

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

ループの次に、置き換えます

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

JSONObject jo = ja.getJSONObject(i);

これを試して、どうなるか教えてください。

于 2013-05-15T01:03:24.907 に答える
0

私は開発中にオートコンプリートテキストビューを設計するために同じコードを使用し、同じ問題に直面しており、最終的に修正しました。

Google コンソールで「Google Place API for Android」と「Google Place API for Web Services」の両方を有効にする必要があります。

また、 URLEncoder.encode(s.toString(), "UTF-8") を URLEncoder.encode(args[0].toString(), "UTF-8") に置き換える必要があります

これがお役に立てば幸いです。

于 2015-05-20T16:44:01.747 に答える