下载时限制带宽

我有一个可以使用互联网连接下载数据的应用程序。 我正在使用HttpURLConnection来做到这一点。

问题:我的应用程序消耗了互联网带宽,因此用户将在浏览器上慢慢浏览。 我想让他们自己设置带宽限制,而不是像这个站点 。 我已经知道了。

问题:下载时如何设置带宽限制? 例如:500 KB / s(每秒KiloBytes)。

这是我下载文件的方法:

 // These are the status codes. public static final int DOWNLOADING = 0; public static final int PAUSED = 1; public static final int COMPLETE = 2; public static final int CANCELLED = 3; public static final int ERROR = 4; private long downloaded; private int status; private void downloadFile(String requestUrl) throws IOException { InputStream stream = null; RandomAccessFile output = null; status = DOWNLOADING; downloaded = 0; URL url = new URL(requestUrl); try { System.setProperty("http.keepAlive", "false"); output = new RandomAccessFile(my_directory, "rw"); // Open connection to URL. HttpURLConnection connection = (HttpURLConnection) url.openConnection(); connection.setConnectTimeout(5000); connection.connect(); // Make sure response code is in the 200 range. int statusCode = connection.getResponseCode(); if (statusCode != 200) { status = ERROR; } stream = connection.getInputStream(); while (status == DOWNLOADING) { byte buffer[] = new byte[1024]; // Read from server into buffer. int read = stream.read(buffer); if (read == -1) break; // Write buffer to file. output.write(buffer, 0, read); downloaded += read; } status == COMPLETE; } catch (Exception e) { status = ERROR; } finally { if (output != null) { try { output.close(); } catch (Exception e) {} } // Close connection to server. if (stream != null) { try { stream.close(); } catch (Exception e) {} } } } 

如果您有一个Socket您可以将接收缓冲区大小设置为所需的带宽延迟产品,但是,如果不这样,您只需在接收呼叫之间hibernate。 实验或一些基于反馈的算法将产生适当的睡眠间隔。

您可以在设置活动中使用移动数据/ Wifi /漫游中的下载等首选项。 您可以使用此类获取连接类型。

/ ** *检查设备的网络连接和速度* @author Max https://stackoverflow.com/users/801646/max * * / public class Connectivity {

 /** * Get the network info * @param context * @return */ public static NetworkInfo getNetworkInfo(Context context){ ConnectivityManager cm = (ConnectivityManager) context.getSystemService(Context.CONNECTIVITY_SERVICE); return cm.getActiveNetworkInfo(); } /** * Check if there is any connectivity * @param context * @return */ public static boolean isConnected(Context context){ NetworkInfo info = Connectivity.getNetworkInfo(context); return (info != null && info.isConnected()); } /** * Check if there is any connectivity to a Wifi network * @param context * @param type * @return */ public static boolean isConnectedWifi(Context context){ NetworkInfo info = Connectivity.getNetworkInfo(context); return (info != null && info.isConnected() && info.getType() == ConnectivityManager.TYPE_WIFI); } /** * Check if there is any connectivity to a mobile network * @param context * @param type * @return */ public static boolean isConnectedMobile(Context context){ NetworkInfo info = Connectivity.getNetworkInfo(context); return (info != null && info.isConnected() && info.getType() == ConnectivityManager.TYPE_MOBILE); } /** * Check if there is fast connectivity * @param context * @return */ public static boolean isConnectedFast(Context context){ NetworkInfo info = Connectivity.getNetworkInfo(context); return (info != null && info.isConnected() && Connectivity.isConnectionFast(info.getType(),info.getSubtype())); } /** * Check if the connection is fast * @param type * @param subType * @return */ public static boolean isConnectionFast(int type, int subType){ if(type==ConnectivityManager.TYPE_WIFI){ return true; }else if(type==ConnectivityManager.TYPE_MOBILE){ switch(subType){ case TelephonyManager.NETWORK_TYPE_1xRTT: return false; // ~ 50-100 kbps case TelephonyManager.NETWORK_TYPE_CDMA: return false; // ~ 14-64 kbps case TelephonyManager.NETWORK_TYPE_EDGE: return false; // ~ 50-100 kbps case TelephonyManager.NETWORK_TYPE_EVDO_0: return true; // ~ 400-1000 kbps case TelephonyManager.NETWORK_TYPE_EVDO_A: return true; // ~ 600-1400 kbps case TelephonyManager.NETWORK_TYPE_GPRS: return false; // ~ 100 kbps case TelephonyManager.NETWORK_TYPE_HSDPA: return true; // ~ 2-14 Mbps case TelephonyManager.NETWORK_TYPE_HSPA: return true; // ~ 700-1700 kbps case TelephonyManager.NETWORK_TYPE_HSUPA: return true; // ~ 1-23 Mbps case TelephonyManager.NETWORK_TYPE_UMTS: return true; // ~ 400-7000 kbps /* * Above API level 7, make sure to set android:targetSdkVersion * to appropriate level to use these */ case TelephonyManager.NETWORK_TYPE_EHRPD: // API level 11 return true; // ~ 1-2 Mbps case TelephonyManager.NETWORK_TYPE_EVDO_B: // API level 9 return true; // ~ 5 Mbps case TelephonyManager.NETWORK_TYPE_HSPAP: // API level 13 return true; // ~ 10-20 Mbps case TelephonyManager.NETWORK_TYPE_IDEN: // API level 8 return false; // ~25 kbps case TelephonyManager.NETWORK_TYPE_LTE: // API level 11 return true; // ~ 10+ Mbps // Unknown case TelephonyManager.NETWORK_TYPE_UNKNOWN: default: return false; } }else{ return false; } } 

}