Articles of android networking

为什么HttpUrlConnection在移动数据连接上抛出SSLException?

当使用Android的HttpUrlConnection库发出HTTPS请求时,我有时会看到抛出以下exception: javax.net.ssl.SSLException: SSL handshake aborted: ssl=0x5c1b18a0: I/O error during system call, Connection reset by peer at org.apache.harmony.xnet.provider.jsse.NativeCrypto.SSL_do_handshake(Native Method) at org.apache.harmony.xnet.provider.jsse.OpenSSLSocketImpl.startHandshake(OpenSSLSocketImpl.java:395) … 在深入研究这个问题之后,我已经了解到了这一点 在wifi上一切正常 仅当设备处于移动数据连接时才会抛出exception 在首先通过wifi进行HTTPS之后,通过移动数据进行连接往往会在一段时间内正常工作 问题似乎发生在少数特定的移动运营商身上 可能会发生什么? 某些移动运营商是否会干扰HTTPS流量?

Android Volley MalformedURLException错误的URL

在使用Volley发出第二个网络请求后,我总是收到此错误。 我输入的url似乎并不重要。 Volley总是声称它是畸形的。 08-04 20:16:26.885 14453-14470/com.thredup.android E/Volley﹕ [994] NetworkDispatcher.run: Unhandled exception java.lang.RuntimeException: Bad URL java.lang.RuntimeException: Bad URL at com.android.volley.toolbox.BasicNetwork.performRequest(BasicNetwork.java:127) at com.android.volley.NetworkDispatcher.run(NetworkDispatcher.java:110) Caused by: java.net.MalformedURLException: Protocol not found: at java.net.URL.(URL.java:176) at java.net.URL.(URL.java:125) at com.android.volley.toolbox.HurlStack.performRequest(HurlStack.java:101) at com.android.volley.toolbox.BasicNetwork.performRequest(BasicNetwork.java:93) 进一步调查,我在HurlStack中放了几个日志。 在 public HttpResponse performRequest(Request request, Map additionalHeaders), 失败的请求是REQUEST [ ] 0x0 LOW 26. “ 因此,HurlStack的第101行: URL parsedUrl = new […]

Android API-23:InetAddressUtils替换

切换到Android Marshmallow API,我在代码中使用org.apache.http.conn.util.InetAddressUtils for InetAddressUtils.isIPv4Address(ipAddress)列出设备中的所有IP。 作为API-23更改的一部分 , InetAddressUtils类现已消失。 我现在如何替换以下代码? public static String ipAddress() { try { for (final Enumeration enumerationNetworkInterface = NetworkInterface.getNetworkInterfaces(); enumerationNetworkInterface.hasMoreElements();) { final NetworkInterface networkInterface = enumerationNetworkInterface.nextElement(); for (Enumeration enumerationInetAddress = networkInterface.getInetAddresses(); enumerationInetAddress.hasMoreElements();) { final InetAddress inetAddress = enumerationInetAddress.nextElement(); final String ipAddress = inetAddress.getHostAddress(); if (! inetAddress.isLoopbackAddress() && InetAddressUtils.isIPv4Address(ipAddress)) { return ipAddress; } […]

使用Android Retrofit进行POST

我是Android编程的新手,也在使用Retrofit。 我已就这个主题做了大量研究,但未能find特定于我需求的解决方案。 我正在使用我们的API并尝试发出POST请求。 我使用以下非Retrofit代码成功实现了此目的: private class ProcessLogin extends AsyncTask { private ProgressDialog pDialog; String email,password; protected void onPreExecute() { super.onPreExecute(); inputEmail = (EditText) findViewById(R.id.email); inputPassword = (EditText) findViewById(R.id.password); email = inputEmail.getText().toString(); password = inputPassword.getText().toString(); pDialog = new ProgressDialog(LoginActivity.this); pDialog.setTitle(“Contacting Servers”); pDialog.setMessage(“Logging in …”); pDialog.setIndeterminate(false); pDialog.setCancelable(true); pDialog.show(); } protected JSONObject doInBackground(Void… params) { HttpURLConnection connection; OutputStreamWriter […]

屏幕打开时,Wi-Fi或CPU是否可以进入睡眠状态?

Android上有WakeLock和WifiLock – 如果我的屏幕永远不会关闭,我是否需要这些? 我使用持久连接(例如WebSockets)几十分钟甚至几小时。 我的屏幕是否总是足以防止设备丢失这些连接(如果我们假设连接仍然可用且服务器正常)? 为了保持屏幕,我使用标准方式: getWindow().addFlags(WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON); 文档说的是什么: 为了避免耗尽电池,一个闲置的Android设备很快就会睡着了。 ( https://developer.android.com/training/scheduling/wakelock.html ) 通常,当用户暂时不使用设备时,Wi-Fi无线电可能会关闭。 ( http://developer.android.com/reference/android/net/wifi/WifiManager.WifiLock.html ) 这是否意味着…… 当用户长时间不与设备交互时(即使屏幕仍然打开),Wi-Fi无线电或CPU可能会进入睡眠模式或关闭? 而且,更具体地说,当仍有Activity使屏幕保持打开时,后台任务(例如IntentService )的Wi-Fi或移动数据连接是否可以进入hibernate状态?

如何获得IPV4格式的IP_ADDRESS

我试图获取设备的IP地址,即使用WIFI或3G连接。 我收到了IPV6格式的IP地址,这是不可理解的。 我想要IPV4格式的IP地址。我已经谷歌但dintfind了任何适当的解决方案。 这是我用来获取设备IP地址的代码 public String getLocalIpAddress() { try { try { for (Enumeration en = NetworkInterface .getNetworkInterfaces(); en.hasMoreElements();) { NetworkInterface intf = en.nextElement(); for (Enumeration enumIpAddr = intf.getInetAddresses(); enumIpAddr.hasMoreElements();) { InetAddress inetAddress = enumIpAddr.nextElement(); System.out.println(“ip1–:” + inetAddress); System.out.println(“ip2–:” + inetAddress.getHostAddress()); if (!inetAddress.isLoopbackAddress()) { String ip = inetAddress.getHostAddress().toString(); System.out.println(“ip—::” + ip); EditText tv = (EditText) […]

在Android 3.x和4.x上为Wifinetworking分配静态IP地址

我工作的一个项目,应该有一个function,如果用户需要设置静态IP地址(DNS,networking掩码,网关)的Wifi 。 我最初的和实际的解决scheme是使用android.provider.Settings.System类,它允许这个function,但是这个解决scheme只适用于Android 2.x设备。 这很好,当然,我不完全是零,但它会很好,也适用于更高版本的Android操作系统。 它不知道为什么它不起作用。 如果我使用这个简单的方法来检查实际状态: public static final boolean hasStaticIp(Context c) { try { return Settings.System.getInt(c.getContentResolver(), Settings.System.WIFI_USE_STATIC_IP) == 1; } catch (SettingNotFoundException e) { Log.i(TAG, "Settings not found (" + e.geMessage() + ")"); return false; } } 它对于Android 2.x和Android 4.x都会返回true,但是在第二种情况下,更改肯定不会反映在Wifi我发现这是一个小小的硬编码解决scheme,但没有像预期的那样工作。 有没有人面对同样的问题? 我会很高兴任何工作的解决scheme,也为根植的设备(也许一些命令在Linux),因为它很容易检查手机是否根源的状态。 提前致谢。

ConnectivityManager getActiveNetworkInfo空指针exception

连接pipe理器中偶尔会看到空指针exception。 从intent服务,我isOnWIFI(this)检查networking状态。 在cm.getActiveNetworkInfo()行发生exception。 这很奇怪,因为在我调用这个之前我检查了null。 注意:权限已设置。 public static boolean isOnWIFI(Context context) { ConnectivityManager cm = (ConnectivityManager) context.getSystemService(Context.CONNECTIVITY_SERVICE); return cm != null //here occurs NullPointerException && cm.getActiveNetworkInfo() != null && ((cm.getNetworkInfo(ConnectivityManager.TYPE_WIFI) != null && cm.getNetworkInfo( ConnectivityManager.TYPE_WIFI).isConnected())); } 任何想法为什么会发生 我无法debugging它,因为它只是偶尔从错误报告。 我只看到解决scheme是把它放到try catch块。 谢谢。

在Android上传和下载率剖析

我试图开发一个Android应用程序来测量我的networking的上传和下载速度,这可能需要运行和configuration文件,每2秒左右。 SpeedTest.net应用程序是一个理想的应用程序,但是,它不是开源的。 而且,我需要它每2秒运行一次。 完成testing需要几秒钟的时间。 我怎样才能做到这一点? 目前我只是下载一个在互联网上发现的小随机.txt文件,并测量size/time-to-download作为衡量下载速度。 但我每次都会得到奇怪的结果。 显然这种方法是行不通的。 更新:下载完成。 有关如何实现上传速度的任何build议?

如何以编程方式查找设备的外部IP地址而不使用外部主机?

当我读取设备的IP地址时,我总是得到本地IP地址。 我使用下面的代码片段来做到这一点。 public String getIpAddress() { try { for (Enumeration<NetworkInterface> en = NetworkInterface.getNetworkInterfaces(); en.hasMoreElements();) { NetworkInterface intf = en.nextElement(); for (Enumeration<InetAddress> enumIpAddr = intf.getInetAddresses(); enumIpAddr.hasMoreElements();) { InetAddress inetAddress = enumIpAddr.nextElement(); if (!inetAddress.isLoopbackAddress()) { String ip = Formatter.formatIpAddress(inetAddress.hashCode()); Log.d("VPNConnected",ip); return ip; } } } } catch (Exception ex) { Log.d("exception", ex.toString()); } return "EMPTY"; } 但我需要阅读外部IP地址,而不使用任何外部主机或网页apis,如http://jsonip.com