web-dev-qa-db-ja.com

java.lang.IllegalArgumentException:クエリの文字が不正です

このエラーメッセージはたくさん投稿されているようですが、私は正しい答えを思い付くことができませんでした。

私は this チュートリアルに従っていますが、Googleプレイス情報を画面に表示できません。私はLogCatを見ていて、これを見ました:

09-20 02:01:32.278: W/System.err(19832): Java.lang.IllegalArgumentException: Illegal character in query at index 127: https://maps.googleapis.com/maps/api/place/nearbysearch/json?location=41.6997688,-86.2406069&radius=1000&sensor=true&types=food|bar|store|museum|art_gallery&key=AIzaSyDdMnQpqT9pr-k6VhwesT1OBAg_qkvflxU
09-20 02:01:32.278: W/System.err(19832):    at Java.net.URI.create(URI.Java:727)
09-20 02:01:32.278: W/System.err(19832):    at org.Apache.http.client.methods.HttpGet.<init>(HttpGet.Java:75)
09-20 02:01:32.278: W/System.err(19832):    at com.mbau.miniproject2.ShowMapActivity$GetPlaces.doInBackground(ShowMapActivity.Java:145)
09-20 02:01:32.278: W/System.err(19832):    at com.mbau.miniproject2.ShowMapActivity$GetPlaces.doInBackground(ShowMapActivity.Java:1)
09-20 02:01:32.278: W/System.err(19832):    at Android.os.AsyncTask$2.call(AsyncTask.Java:287)
09-20 02:01:32.278: W/System.err(19832):    at Java.util.concurrent.FutureTask.run(FutureTask.Java:234)
09-20 02:01:32.278: W/System.err(19832):    at Android.os.AsyncTask$SerialExecutor$1.run(AsyncTask.Java:230)
09-20 02:01:32.278: W/System.err(19832):    at Java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.Java:1080)
09-20 02:01:32.278: W/System.err(19832):    at Java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.Java:573)
09-20 02:01:32.278: W/System.err(19832):    at Java.lang.Thread.run(Thread.Java:841)
09-20 02:01:32.388: W/System.err(19832): org.json.JSONException: End of input at character 0 of 
09-20 02:01:32.388: W/System.err(19832):    at org.json.JSONTokener.syntaxError(JSONTokener.Java:450)
09-20 02:01:32.388: W/System.err(19832):    at org.json.JSONTokener.nextValue(JSONTokener.Java:97)
09-20 02:01:32.388: W/System.err(19832):    at org.json.JSONObject.<init>(JSONObject.Java:154)
09-20 02:01:32.388: W/System.err(19832):    at org.json.JSONObject.<init>(JSONObject.Java:171)
09-20 02:01:32.388: W/System.err(19832):    at com.mbau.miniproject2.ShowMapActivity$GetPlaces.onPostExecute(ShowMapActivity.Java:187)
09-20 02:01:32.388: W/System.err(19832):    at com.mbau.miniproject2.ShowMapActivity$GetPlaces.onPostExecute(ShowMapActivity.Java:1)
09-20 02:01:32.388: W/System.err(19832):    at Android.os.AsyncTask.finish(AsyncTask.Java:631)
09-20 02:01:32.388: W/System.err(19832):    at Android.os.AsyncTask.access$600(AsyncTask.Java:177)
09-20 02:01:32.388: W/System.err(19832):    at Android.os.AsyncTask$InternalHandler.handleMessage(AsyncTask.Java:644)
09-20 02:01:32.388: W/System.err(19832):    at Android.os.Handler.dispatchMessage(Handler.Java:99)
09-20 02:01:32.388: W/System.err(19832):    at Android.os.Looper.loop(Looper.Java:137)
09-20 02:01:32.388: W/System.err(19832):    at Android.app.ActivityThread.main(ActivityThread.Java:5276)
09-20 02:01:32.388: W/System.err(19832):    at Java.lang.reflect.Method.invokeNative(Native Method)
09-20 02:01:32.388: W/System.err(19832):    at Java.lang.reflect.Method.invoke(Method.Java:525)
09-20 02:01:32.388: W/System.err(19832):    at com.Android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.Java:739)
09-20 02:01:32.388: W/System.err(19832):    at com.Android.internal.os.ZygoteInit.main(ZygoteInit.Java:555)
09-20 02:01:32.388: W/System.err(19832):    at dalvik.system.NativeStart.main(Native Method)

私が持っているコードは、URLのGoogle APIキー、マニフェストのMapsキーを除いて、チュートリアルで提供されているものと文字通りまったく同じです。私のメインアクティビティはShowMapActivityと呼ばれます。

これが機能しない理由はわかりませんが、最初のエラーが発生するURLと関係があると思います。

同時に、URLに無効な文字が表示されないため、LogCatからブラウザにURLをコピーして貼り付けると、NiceJSONファイルが返されます。

考え/可能な修正はありますか?

ありがとう。

リンク 私のファイルへ

6
user2060214

そのため、コードを次のように変更することになりました。

    String placesSearchStr="https://maps.googleapis.com/maps/api/place/nearbysearch/"
    +"json?location="
    +String.valueOf(lat)
    +","
    +String.valueOf(lng)
    +"&radius=5000&sensor=true"
    +"&types=food|bar|church|museum|art_gallery"
    +"&key=AIzaSyDdMnQpqT9pr-k6VhwesT1OBAg_qkvflxU";

に:

String latVal=String.valueOf(lat);
String lngVal=String.valueOf(lng);
String url;
try {
        url = "https://maps.googleapis.com/maps/api/place/nearbysearch/json?location="
        +URLEncoder.encode(latVal, "UTF-8")
        +","
        +URLEncoder.encode(lngVal, "UTF-8")
        +"&radius="
        +URLEncoder.encode("5000", "UTF-8")
        +"&sensor="
        +URLEncoder.encode("true", "UTF-8")
        +"&types="
        +URLEncoder.encode("food|bar|church|museum|art_gallery", "UTF-8")
        +"&key="
        +URLEncoder.encode("AIzaSyDdMnQpqT9pr-k6VhwesT1OBAg_qkvflxU", "UTF-8");
        new GetPlaces().execute(url);
    } catch (UnsupportedEncodingException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    }

そして、これは私の問題を解決しました。

33
user2060214

これらのHTTPの詳細を処理し、Javaメソッドとオブジェクトを介してGooglePlaces APIと対話できるようにする、Javaライブラリを使用する場合は、試すことができます Sprockets (開示:私は開発者です)。

また、Google Places APIで使用するローダー、アダプター、ウィジェットを含むAndroidライブラリプロジェクトにも取り組んでいます。

AndroidでSprocketsを使用する場合、リリースビルドにProGuardを使用して、依存関係ライブラリ内の未使用のコードを削除することをお勧めします(依存関係についてはPOMを参照してください)。

0
pushbit

Lat&longを追加するときは、String.valueOf()を使用してみてください。文字列が表示されているときに切り取られているものを解析しようとすると問題が発生する余分なものがそこに残っている可能性があります。

String placesSearchStr = new String(
    "https://maps.googleapis.com/maps/api/place/nearbysearch/"
    +"json?location="
    +String.valueOf(lat)
    +","
    +String.valueOf(lng)
    +"&radius=5000&sensor=true"
    +"&types=food|bar|store|museum|art_gallery"
    +"&key=AIzaSyDdMnQpqT9pr-k6VhwesT1OBAg_qkvflxU"
    ,"UTF-8");
0
Jon