【问题标题】:Android -urlConnection.getInputStream() fails - InputStream stays nullAndroid -urlConnection.getInputStream() 失败 - InputStream 保持为空
【发布时间】:2017-08-28 03:40:54
【问题描述】:

我正在尝试从 Android 中的 Google 路线服务器检索 JSON 数据。但是获取输入流失败并引发异常。我收到错误消息 ,,null" 并且输入流为空。

HTTP 连接我做错了什么?该 URL 在我的浏览器上运行。

     private String doRequest() {
    String response = null;
    HttpURLConnection urlConnection = null;
    InputStream in = null;
    URL url = null;
    String queryString ="https://maps.googleapis.com/maps/api/directions/json?origin=40.71926430971954,-74.26603317260742&destination=40.74309523218185," +
            "-74.24732208251953&sensor=false&mode=walking&alternatives=true&key=AIzaSyASF2b0E0HHilJL5I936vqRbiBjM5XuPRA";


    try {
        url = new URL(queryString);
        urlConnection = (HttpURLConnection) url.openConnection();
        in = urlConnection.getInputStream();
    }

    catch (Exception e) {
        {
            StringBuilder builder = new StringBuilder();
            if (response == null)
                builder.append("Response is null.");
            if (url == null)
                builder.append("url is null.");
            if (urlConnection == null)
                builder.append("UrlConnection is null.");
            if (in == null)
                builder.append("Inputstream is null.");

            return builder.toString() +e.getMessage();
        }


    } finally {
        if (urlConnection != null)
            urlConnection.disconnect();
    }
    if (response == null)
    {
        return "sorry, response is null. At least it passed the exceptions.";
    }
    return response;
}

编辑:

Here is the error message


编辑 2:

好的,我尝试了各种建议。现在,当我执行代码时,什么也没有发生。打不开对话框,不知道这次是什么问题。

public void getJSON(View v)
{
   AsyncTask<String, Void, String>hello = new GetData(this).execute(queryString);
}

导入android.app.Dialog;

导入 android.app.ProgressDialog;

导入android.content.Context;

导入android.content.DialogInterface;

导入android.net.http.HttpsConnection;

导入android.os.AsyncTask;

导入 android.support.v7.app.AlertDialog;

导入android.view.View;

导入 java.io.InputStream;

导入 java.net.HttpURLConnection;

导入 java.net.URL;

导入 javax.net.ssl.HttpsURLConnection;

(公共类 GetData 扩展 AsyncTask)

{

private Exception exception;
public String response;
private Context context;
private ProgressDialog dialog = null;
public GetData(Context context)
{
    this.context = context;
}

protected String doInBackground(String... urls)
{
    this.response = doRequest(urls[0]);

    return response;
}

protected void onPostExecute() {
    // TODO: check this.exception
    // TODO: do something with the feed

    if (this.exception != null && response != null)
    {
        getDialog(getResponse(), context).show();
    }
    else
    {
        getDialog("sorry" + exception.getMessage(), context).show();
    }

}

private String doRequest(String queryString) {
    String response1 = null;
    HttpsURLConnection urlConnection = null;
    InputStream in = null;
    URL url = null;

    try {
        url = new URL(queryString);
        urlConnection =(HttpsURLConnection) url.openConnection();

        urlConnection.setRequestMethod("GET"); // or POST
        urlConnection.setRequestProperty("User-Agent", "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/56.0.2924.87 Safari/537.36");
        urlConnection.setRequestProperty("Accept-Charset", "UTF-8");
        urlConnection.setDoInput(true);
        urlConnection.setDoOutput(true);

        int responseCode = urlConnection.getResponseCode();

        if (responseCode == HttpsURLConnection.HTTP_OK)
        {
            in = urlConnection.getInputStream();
            response1 = convertStreamToString(in);
        }

    } catch (Exception e) {
        {
            StringBuilder builder = new StringBuilder();
            if (response1 == null)
                builder.append("Response is null.");
            if (url == null)
                builder.append("url is null.");
            if (urlConnection == null)
                builder.append("UrlConnection is null.");
            if (in == null)
                builder.append("Inputstream is null.");

            return builder.toString() + e.getMessage();
        }

    } 

    finally
    {
        if (urlConnection != null)
            urlConnection.disconnect();
    }

    if (response1 == null)
    {
        return "sorry, response is null. At least it passed the exceptions.";
    }
    return response1;
}

private String convertStreamToString(java.io.InputStream is)
{
    java.util.Scanner s = new java.util.Scanner(is).useDelimiter("\\A");
    return s.hasNext() ? s.next() : "";
}

public String getResponse()
{
    return this.response;
}


public Dialog getDialog(String string, Context context) {
    AlertDialog.Builder builder = new AlertDialog.Builder(context);
    builder.setMessage(string);
    builder.setPositiveButton("OK",
            new DialogInterface.OnClickListener() {
                @Override
                public void onClick(DialogInterface dialog, int which) {
                    dialog.dismiss();
                }
            });
    return builder.create();

}

【问题讨论】:

  • 检查网络连接
  • 请发布您的 HttpURLConnection 导入包。
  • e.getMessage() 包含什么?
  • 我可以在虚拟设备上冲浪,并且可以在 gradle 上上网。我还能检查什么?
  • @KarlBall 为 HttpURLConnection 导入包

标签: android json null inputstream httpurlconnection


【解决方案1】:

您可以尝试在主线程的 doRequest() 中执行网络操作。在 AsyncTask https://developer.android.com/reference/android/os/AsyncTask.html 中运行您的代码 以下代码可能对您有所帮助

问题在于您的 onPostExecute 和对话框。您应该覆盖 onPostExecute 并且 getDialog 将返回 AlertDialog。每当您的请求成功时,异常必须为空。检查我编辑的代码:

    class GetData extends AsyncTask<String, Void, String> {

        private Exception exception;
        public String response;
        private Context context;
        private ProgressDialog dialog = null;

        public GetData(Context context) {
            this.context = context;
        }

        protected String doInBackground(String... urls) {
            this.response = doRequest(urls[0]);

            return response;
        }

        @Override
        protected void onPostExecute(String s) {
            // TODO: check this.exception
            // TODO: do something with the feed

            if (this.exception == null && response != null) {
                getDialog(response, context).show();
            } else {
                getDialog("sorry" + exception.getMessage(), context).show();
            }

        }

        private String doRequest(String queryString) {
            HttpsURLConnection urlConnection = null;
            InputStream in = null;
            URL url = null;

            try {
                url = new URL(queryString);
                urlConnection = (HttpsURLConnection) url.openConnection();

                urlConnection.setRequestMethod("GET"); // or POST
                urlConnection.setRequestProperty("User-Agent", "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/56.0.2924.87 Safari/537.36");
                urlConnection.setRequestProperty("Accept-Charset", "UTF-8");
                urlConnection.setDoInput(true);
                urlConnection.setDoOutput(true);

                int responseCode = urlConnection.getResponseCode();

                if (responseCode == HttpsURLConnection.HTTP_OK) {
                    in = urlConnection.getInputStream();
                    response = convertStreamToString(in);
                }

            } catch (Exception e) {
                {
                    exception = e;
                    StringBuilder builder = new StringBuilder();
                    if (response == null)
                        builder.append("Response is null.");
                    if (url == null)
                        builder.append("url is null.");
                    if (urlConnection == null)
                        builder.append("UrlConnection is null.");
                    if (in == null)
                        builder.append("Inputstream is null.");

                    return builder.toString() + e.getMessage();
                }

            } finally {
                if (urlConnection != null)
                    urlConnection.disconnect();
            }

            if (response == null) {
                return "sorry, response is null. At least it passed the exceptions.";
            }
            return response;
        }

        private String convertStreamToString(java.io.InputStream is) {
            java.util.Scanner s = new java.util.Scanner(is).useDelimiter("\\A");
            return s.hasNext() ? s.next() : "";
        }

       /* public String getResponse() {
            return this.response;
        }*/


        public AlertDialog getDialog(String string, Context context) {
            AlertDialog.Builder builder = new AlertDialog.Builder(context);
            builder.setMessage(string);
            builder.setPositiveButton("OK",
                    new DialogInterface.OnClickListener() {
                        @Override
                        public void onClick(DialogInterface dialog, int which) {
                            dialog.dismiss();
                        }
                    });
            return builder.create();



   }
}

public void getJSON(View v)
{
   AsyncTask<String, Void, String>hello = new GetData(MainActivity.this).execute(queryString);//MainActivity will be your activity 
}

【讨论】:

  • 确实如此,我尝试在MainActivity中执行代码。但是,我现在已经尝试过使用 AsyncTask,但它仍然无法正常工作。我做错了什么?
  • @Karl Ball 您现在面临的问题是什么。上面的代码对我来说很好。
  • @Karl Ball 问题在于您的 onPostExecute 和对话框。您应该覆盖 onPostExecute 并且 getDialog 将返回 AlertDialog。每当您的请求成功时,异常必须为空。检查我编辑的代码。
【解决方案2】:

您的链接使用 HTTPS 协议,但您尝试将连接转换为 HTTP 而不是 HTTPS:

urlConnection = (HttpURLConnection) url.openConnection();

尝试删除强制转换并执行以下操作:

URLConnection urlConnection = url.openConnection();

或将其转换为 HTTPS:

urlConnection = (HttpsURLConnection) url.openConnection();

现在 InputStream 不应该为空。

问候

【讨论】:

    【解决方案3】:

    首先,在清单文件中添加 Internet 权限:

    <uses-permission android:name="android.permission.INTERNET" />
    

    然后将其添加到您现有的代码中:

    urlConnection.setRequestMethod("GET"); // or POST
    urlConnection.setRequestProperty("User-Agent", "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/56.0.2924.87 Safari/537.36");
    urlConnection.setRequestProperty("Accept-Charset", "UTF-8");
    urlConnection.setDoInput(true);
    urlConnection.setDoOutput(true);
    

    然后查看响应码:

    if (responseCode == HttpURLConnection.HTTP_OK) {
    }
    

    您还应该将读取 InputStream 的方式更改为:

    try {
        BufferedReader input = new BufferedReader(
                new InputStreamReader(urlConnection.getInputStream(), "UTF-8")); 
        StringBuilder strB = new StringBuilder();
        String str;
        while (null != (str = input.readLine())) {
            strB.append(str).append("\r\n"); 
        }
        input.close();
    } catch (IOException e) {
        e.printStackTrace();
    }
    

    【讨论】:

      猜你喜欢
      • 2013-02-27
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-12-03
      • 2023-03-07
      • 1970-01-01
      • 2021-06-12
      • 2018-11-19
      相关资源
      最近更新 更多