在Android模拟器上,Https post可以正常工作,但在设备上却无法正常工作。

3
我正在尝试使用以下代码将数据发布到Https URL。我已经在模拟器中进行了检查,它可以正常工作。但是在设备上无法工作。请有人帮助我解决问题。
  public Boolean PostData(String data) throws IOException {
  Boolean response = false;
  TrustManager[] trustAllCerts = new TrustManager[] {new X509TrustManager() {
    @Override
    public java.security.cert.X509Certificate[] getAcceptedIssuers() {
      return null;
    }

    @Override
    public void checkClientTrusted(java.security.cert.X509Certificate[] certs, String authType) {
    }

    @Override
    public void checkServerTrusted(java.security.cert.X509Certificate[] certs, String authType) {
    }
  }};

  // Install the all-trusting trust manager
  try {
    SSLContext sc = SSLContext.getInstance("TLS");
    sc.init(null, trustAllCerts, new java.security.SecureRandom());

    HttpsURLConnection.setDefaultSSLSocketFactory(sc.getSocketFactory());
  } catch (Exception e) {
  }


  HostnameVerifier hostnameVerifier =
      org.apache.http.conn.ssl.SSLSocketFactory.ALLOW_ALL_HOSTNAME_VERIFIER;


  SchemeRegistry registry = new SchemeRegistry();
  SSLSocketFactory socketFactory = SSLSocketFactory.getSocketFactory();
  socketFactory.setHostnameVerifier((X509HostnameVerifier) hostnameVerifier);
  registry.register(new Scheme("https", socketFactory, 443));

  // Set verifier
  StringBuilder postDataBuilder = new StringBuilder();
  postDataBuilder.append("data").append("=").append(data);
  byte[] postData = postDataBuilder.toString().getBytes("UTF-8");

  URL postURL = new URL(url);

  HttpsURLConnection conn = (HttpsURLConnection) postURL.openConnection();
  conn.setDoOutput(true);
  conn.setUseCaches(false);
  HttpsURLConnection.setDefaultHostnameVerifier(new CustomizedHostnameVerifier());
  conn.setRequestMethod("POST");
  conn.setRequestProperty("Content-Type", "application/x-www-form-urlencoded");
  conn.setRequestProperty("Content-Length", Integer.toString(postData.length));

  // ------------------
  OutputStream out = conn.getOutputStream();
  // --------------------------
  out.write(postData);
  out.close();

  return response;
}

private static class CustomizedHostnameVerifier implements HostnameVerifier {
  @Override
  public boolean verify(String hostname, SSLSession session) {
    return true;
  }
}

有没有办法在我们提交数据后获取该URL上显示的响应。
谢谢, Mahesh

那你为什么要构造一个 DefaultHttpClient 呢?好像你并没有使用它。 - Jens
实际上在之前的版本中,我使用httpclient发布到HTTP URL。现在服务器是在HTTPS上,我进行了更改但是只是忘记删除它了。 - mahesh
1个回答

0

你使用过INTERNET权限吗?

你需要在清单文件中添加以下内容:

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

模拟器上的互联网功能正常,但如果您想在真实设备上使用它,则必须使用权限。


你是在解析本地页面还是外部服务器上的页面? - ArcDare
@ArcDare,会有什么问题吗?你有什么想法吗? - mahesh
其实我不是很清楚,我得用调试器来检查一下,但我现在太忙了。我认为,当某些东西在模拟器上可以运行但在真实设备上却不能时,通常与你正在尝试使用的某些资源有关,而这些资源可能不存在。我的意思是,你知道你的代码没问题,因为它在模拟器上可以运行。现在你需要问自己:我正在使用哪些可能不在设备上的资源?(我熟悉使用http发布信息,但不熟悉安全性,所以无法告诉你) - ArcDare

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