java.lang.IllegalArgumentException: 查询中包含非法字符

6
似乎这个错误信息已经被发布了很多次,但我还没有找到正确的答案。
我正在按照this教程进行操作,但无法在屏幕上显示Google Places信息。我查看了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复制/粘贴到浏览器中时,它返回一个漂亮的JSON文件。
有什么想法/可能的解决方案吗?
谢谢。
我的文件链接

你的代码的187行是什么?你引用的源代码只有大约155行。 - Jon
通过 Dropbox 的 .zip 文件添加了我的代码。 我的代码第 187 行是: places = new MarkerOptions[placesArray.length()]; //为每个返回的地点设置标记选项 - user2060214
@Jon 更明确地说:第187行实例化了使用返回的“results”数组长度创建的MarkerOptions数组。 - user2060214
@pratik https://www.dropbox.com/s/s30kgdt6srtaspz/MiniProject2.zip - user2060214
3个回答

33

所以我最终改变了我的代码:

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

这解决了我的问题。


啊哈,我知道它肯定是沿着那个方向。现在我记得有人说使用“UTF-8”是一个好习惯,但我以前从未遇到过实际需要它的任何问题。感谢您的跟进,我已经更新了我的答案,并提供了一种稍微更简单的设置格式的方法。 - Jon
同样的教程,同样的问题。非常感谢! - The Dude
这是否有效:+12.4242,-98.1739 | +12.4298,-98.1739。 - Bat

0
尝试在添加经纬度时使用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");

谢谢帮忙。不幸的是那个方法没有奏效。LogCat错误依然相同。 - user2060214

0

如果您想使用一个处理HTTP细节并允许您通过Java方法和对象与Google Places API交互的Java库,您可以尝试Sprockets(声明:我是开发人员)。

我还在开发一个Android库项目,其中包括用于Google Places API的加载器、适配器和小部件。

请注意,在Android中使用Sprockets时,您很可能希望对发布版本使用ProGuard来剥离依赖库中未使用的代码(请参阅POM以获取依赖项)。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接