我正在尝试从Android中的Google Directions Server检索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;
}
编辑:
编辑2:
好的,我尝试过各种建议。现在当我执行代码时没有任何反应。我无法打开一个对话框,所以我不知道这次是什么问题。
public void getJSON(View v)
{
AsyncTask<String, Void, String>hello = new GetData(this).execute(queryString);
}
导入android.app.Dialog;
import android.app.ProgressDialog;
import android.content.Context;
import android.content.DialogInterface;
导入android.net.http.HttpsConnection;
import android.os.AsyncTask;
import android.support.v7.app.AlertDialog;
导入android.view.View;
import java.io.InputStream;
import java.net.HttpURLConnection;
import 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();
}
答案 0 :(得分:0)
首先,为您的清单文件添加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();
}
答案 1 :(得分:0)
您使用HTTPS协议的链接,但您尝试将连接转换为HTTP而不是HTTPS:
urlConnection = (HttpURLConnection) url.openConnection();
尝试删除强制转换并执行:
URLConnection urlConnection = url.openConnection();
或者将其转换为HTTPS:
urlConnection = (HttpsURLConnection) url.openConnection();
现在InputStream不应为null。
此致
答案 2 :(得分:0)
您可能会尝试在主线程上的doRequest()中执行网络操作。在AsyncTask https://developer.android.com/reference/android/os/AsyncTask.html中运行您的代码 以下代码可以帮助您
问题在于你的onPostExecute和对话框。你应该覆盖onPostExecute,getDialog将返回AlertDialog。每当您的请求成功时,异常必须为null。检查我编辑的代码:
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
}