为 Google Maps API v2 Android 发布流媒体方向

Posted

技术标签:

【中文标题】为 Google Maps API v2 Android 发布流媒体方向【英文标题】:Issue streaming directions for Google Maps API v2 Android 【发布时间】:2014-06-19 05:59:31 【问题描述】:

所以我的应用程序的一部分构建了一个导航方向字符串,然后尝试解析 JSON 并在我的地图上绘制折线路线。我首先使用位置变量或区域设置常量构建我的字符串。我最终得到了类似

https://maps.googleapis.com/maps/api/directions/json?origin=Full Frame Documentary Film 
Festival, Durham, 27701&destination=601 W Peace St, Raleigh,27605&sensor=false&key=API_KEY
没有新行(我添加它是为了便于阅读)并且 API_KEY 是我的实际 api 密钥。

我遇到的问题是,当我将该 URL 字符串传递给这个 downloadUrl(String urlString) 方法时

private String downloadUrl(String urlString) throws IOException 
    Log.d(TAG, "Downloaded string = " + urlString);
    String data = "";
    InputStream stream = null;
    HttpURLConnection urlConnection = null;
    try 

        // Display our JSON in our browser (to show us how we need to implement our parser)
        Intent intent = new Intent(android.content.Intent.ACTION_VIEW, Uri.parse(urlString)); 
        intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
        startActivity(intent);

        URL url = new URL(urlString);

        // Create a http connection to communicate with url
        urlConnection = (HttpURLConnection) url.openConnection();
        urlConnection.connect();

        // read in our data
        stream = urlConnection.getInputStream(); 
        BufferedReader br = new BufferedReader(new InputStreamReader(stream)); 
        StringBuffer sb = new StringBuffer();   

        // read in our data in, and append it as a single data string
        String line = "";
        while ((line = br.readLine()) != null) 
            Log.d(TAG,"url download stream: " + line);
            sb.append(line);
        
        data = sb.toString();
        br.close();
     
    catch (Exception e) 
        e.printStackTrace();
    
    finally 
        Log.d(TAG, "Downloaded data = " + data);
        stream.close();
        urlConnection.disconnect();
    

    return data;
    

JSON 在我的浏览器中正确显示,我看到了谷歌在文档中描述的所有内容。但是在以下几行中,当我尝试打开与 URL 的连接并将 JSON 拉入字符串进行解析时,我收到 System.err 通知

05-02 09:56:01.540: W/System.err(32232): java.io.FileNotFoundException: 
https://maps.googleapis.com/maps/api/directions/json?origin=Full Frame Documentary 
Film Festival, Durham, 27701&destination=601 W Peace St, Raleigh, 27605&sensor=false&key=API_KEY

我想我的困惑在于浏览器完美地显示了解析的地址,但是到(我相信是)同一服务器的连接返回了 FNFE。假设是这种情况,我错了吗?如果是这样,我的钥匙可能真的错了吗?令人困惑的是,这段代码在另一个应用程序中工作。

【问题讨论】:

另一件事:不确定,但您似乎将 HTTP 请求与 UI 逻辑混合在一起。涉及网络流量的 IO-ops 不得在 UI-Thread 上执行。使用AsyncTask 等。 @hgoebl 代码有点欺骗性,因为这个方法实际上是从我的 AsyncTask 的 doInBackground() 调用的,并且是一个简单地清理代码的方法。再次感谢 好的,那么您已经做到了最好的方法:-),但是您可以稍微改进一下异常处理:在依赖getInputStream() 返回响应之前调用urlConnection.getResponseCode()。对于4xx5xx HTTP 状态码,调用 getInputStream() 会引发异常,如果您对错误响应的正文感兴趣,则必须调用getErrorStream() @hgoebl 我感觉你已经做了一些 http 连接:P 非常感谢一切都非常有帮助 【参考方案1】:

您必须对参数进行 URL 编码,例如URL 中的空格(“”)写为“+”。您的浏览器内部会执行此操作,可能不会向您显示提交的 URL。

static String urlEncode(String value) 
    try 
        return URLEncoder.encode(value, "UTF-8");
     catch (UnsupportedEncodingException e) 
        return value;
    

但不要对整个 URL 进行编码,只对参数值进行编码。如果参数名称不是 ASCII,它们也必须进行编码,但 Google API 不使用此类参数。

【讨论】:

非常感谢您,老实说,我从来没有想过这一点,因为我认为这些类型的转换将在内部处理。像魅力一样工作 如果你想避免繁琐的HttpURLConnection编程,你可以使用DavidWebb。 很不错,值得研究

以上是关于为 Google Maps API v2 Android 发布流媒体方向的主要内容,如果未能解决你的问题,请参考以下文章

如何在 Android Google Maps API v2 中将 LatLng 和半径转换为 ​​LatLngBounds?

如何使用 Google MAps API v2 围绕引脚绘制圆圈

Google Maps API v2:如何使标记可点击?

将 Google maps api v2 添加到现有项目

Google maps api v2如何找到最近的位置

Google Maps Android API v2 - 检测地图上的触摸