有没有办法检测Android上使用的是哪个蜂窝网络?
我的应用程序将提供实时视频流。我想知道是否有办法检测用户的设备上是否有2G、3G或4G,以及当前连接是否属于哪一类?我的问题是专门针对Android设备的。我不知道有什么方法可以查询设备的硬件功能(有哪些无线电),但如果你问如何检测当前的蜂窝数据连接类型,请查看,它“返回一个指示无线电技术(网络类型)的常数”目前在设备上用于数据传输”有没有办法检测Android上使用的是哪个蜂窝网络?,android,Android,我的应用程序将提供实时视频流。我想知道是否有办法检测用户的设备上是否有2G、3G或4G,以及当前连接是否属于哪一类?我的问题是专门针对Android设备的。我不知道有什么方法可以查询设备的硬件功能(有哪些无线电),但如果你问如何检测当前的蜂窝数据连接类型,请查看,它“返回一个指示无线电技术(网络类型)的常数”目前在设备上用于数据传输” 我会考虑值 NETWorksType,LTE 和 NETWorksYyType HSPAP < /代码>以指示4G连接。由于3G和4G之间的界限模糊,并且由于一组
我会考虑值<代码> NETWorksType,LTE 和<代码> NETWorksYyType HSPAP < /代码>以指示4G连接。由于3G和4G之间的界限模糊,并且由于一组旧技术已被有效固定(我们没有发明新的2G网络),更好的策略可能是识别不足的网络技术,并在连接使用已知的慢速技术(例如EDGE)时显示警告
还要记住,网络技术本身并不一定等同于一定的连接速度。甚至4G连接的运行速度也可能不足以进行视频流传输,这取决于许多因素,其中一些因素是设备外部因素(天气、信号强度、设备电池电量、基站可用带宽等) 其他注意事项:- 您应该首先检查活动网络连接是否为蜂窝连接。为此,获取并检查该对象的属性。这将指示活动网络是Wi-Fi还是蜂窝网络。请记住,可能没有活动网络(
将返回)null
- 您还应该检查关于当前网络连接是否有数据限制的提示。如果是这样,则无论连接类型如何,都应在执行数据密集型操作之前警告用户
- 这是一个,您可以将其分叉并编辑
package com.emil.android.util;
import android.content.Context;
import android.net.ConnectivityManager;
import android.net.NetworkInfo;
import android.telephony.TelephonyManager;
/**
* Check device's network connectivity and speed
* @author emil http://stackoverflow.com/users/220710/emil
*
*/
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;
}
}
}
还要确保将此权限添加到您的AndroidManifest.xml中
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE"></uses-permission>
对于所有小于或等于100kbps的速度,网络被视为2G。
对于所有大于100kbps和小于1mbps的速度,网络被视为3G。
对于所有大于1mbps的速度,网络被视为4G。
网络速度的来源包括维基百科我看到它有很多种类型:网络类型:未知网络类型:GPRS网络类型:边缘网络类型:UMTS网络类型:HSDPA网络类型:HSUPA网络类型:HSPA网络类型:CDMA网络类型:EVDO 0网络类型:EVDO A网络类型:EVDO B网络类型:RTT网络类型:IDEN网络类型:LTE有一个类似的问题得到了重复的回答,答案可以在这里找到:我认为它还没有完全解决,如何使用管理器将其缩小到2G、3G或4G。如果我认为用户使用的是3G,而实际上是2G,这会对我试图创造的体验产生影响。@AndroidDeveloper您必须简要研究各种类型的网络,以确定每种网络的产生和理论最大速度;但是,我建议只确定绝对不适合的网络类型(2G或更早),并将其排除在外。使用这种方法无法有效区分3G和4G连接。我希望获得更多反馈,看看是否有人区分了不同的网络类型并对其速度进行了分类。这将有望为我和其他人节省很多时间。我正在我的应用程序中使用这些代码。我还在网上的某个地方找到了它,我记不得它在哪里了。1xRTT-(50-100kbps)CDMA-(14-64kbps)EDGE-(50-100kbps)EVDO-(400-1000kbps)EVDO_A-(600-1400kps)GPRS-(100kbps)HSDPA-(2-14Mbps)HSPA-(700-1700kbps)HSUPA-(1-23Mbps)UMTS-(400-7000 kbps)EHRPD-(1-2Mbps)EVDO_B-(5 Mbps)HSPAP-(10-20Mbps)IDEN-(25kbps)LTE-(10+Mbps)@kuchi请记住,网络拥塞、数据计划超期和其他因素意味着连接类型不是实际速度的可靠指标。这门课太棒了。我发现它对我很有用。我希望我能接受它作为答案。+15000Ultimate class,这是非常有用的Bravo,这是我见过的最好的一门课。+1可能值得一提的是编写了clas当你的答案写下来的时候,看起来就像是你写的。