检查Android上的移动网络(GSM)连接是否正确的正确方法是什么? (> 2.1)我不想检查移动网络上是否有可用的数据连接,只检查网络可用性。 (检查是否可以通过移动网络拨打电话)
目前我正在使用以下支票:
public static boolean checkMobileNetworkAvailable(Context context){
TelephonyManager tm = (TelephonyManager) context.getSystemService(Context.TELEPHONY_SERVICE);
int networkType = tm.getNetworkType();
return (networkType != TelephonyManager.NETWORK_TYPE_UNKNOWN);
}
但似乎有些设备总是报告“NETWORK_TYPE_UNKNOWN”。所以检查一直都失败了。
有更好的方法吗?
更新:
以下方法会更好吗?
public static boolean checkMobileNetworkAvailable(Context context){
boolean isMobileNetworkAvailable = false;
ConnectivityManager cm = (ConnectivityManager) context.getSystemService(Context.CONNECTIVITY_SERVICE);
NetworkInfo[] networks = cm.getAllNetworkInfo();
for(int i=0;i<networks.length;i++){
if(networks[i].getType() == ConnectivityManager.TYPE_MOBILE){
if(networks[i].isAvailable()){
isMobileNetworkAvailable = true;
}
}
}
return isMobileNetworkAvailable;
}
答案 0 :(得分:8)
我使用以下代码来了解我是否已连接到网络(无移动数据):
public static Boolean isMobileAvailable(Context appcontext) {
TelephonyManager tel = (TelephonyManager) appcontext.getSystemService(Context.TELEPHONY_SERVICE);
return ((tel.getNetworkOperator() != null && tel.getNetworkOperator().equals("")) ? false : true);
}
仅当手机实际注册到网络时才会返回NetworkOperator。
答案 1 :(得分:4)
对我来说工作正常PhoneStateListener:
private static class YourListener extends PhoneStateListener {
@Override
public void onServiceStateChanged(ServiceState serviceState){
if (serviceState.getState() == ServiceState.STATE_IN_SERVICE) {
// connected to cellular network
}
}
}
在TelephonyManager中注册:
TelephonyManager tm = (TelephonyManager) context.getSystemService(Context.TELEPHONY_SERVICE);
YourListener listener = new YourListener();
tm.listen(listener, PhoneStateListener.LISTEN_SERVICE_STATE);
在注册时,电话管理器调用侦听器对象上的onServiceChanged()方法并传递当前状态。
PS:PhoneStateListener使用Handler将结果发布到UI线程,因此您应该在UI线程中创建它。
答案 2 :(得分:2)
我使用以下方法检查android中网络连接的可用性。最好的是您可以按原样复制此方法,并可以使用它来检查网络连接。它会检查所有网络的连接,以确保是否连接了任何网络。
/**
* Check the hardware if there are connected to Internet or not.
* This method gets the list of all available networks and if any one of
* them is connected returns true. If none is connected returns false.
*
* @param context {@link Context} of the app.
* @return <code>true</code> if connected or <code>false</code> if not
*/
public static boolean isNetworkAvailable(Context context) {
boolean available = false;
try {
ConnectivityManager connectivity = (ConnectivityManager) context.getSystemService(Context.CONNECTIVITY_SERVICE);
if (connectivity != null) {
NetworkInfo[] info = connectivity.getAllNetworkInfo();
if (info != null) {
for (int i = 0; i < info.length; i++) {
if (info[i].getState() == NetworkInfo.State.CONNECTED) {
available = true;
}
}
}
}
if (available == false) {
NetworkInfo wiMax = connectivity.getNetworkInfo(6);
if (wiMax != null && wiMax.isConnected()) {
available = true;
}
}
} catch (Exception e) {
e.printStackTrace();
}
return available;
}
答案 3 :(得分:1)
查看我对Problem in detecting Internet Connection in Android的回答。
如果网络不可用或仍在连接,您可能会收到NETWORK_TYPE_UNKNOWN
响应。
答案 4 :(得分:0)
我相信这可以胜任......
ConnectivityManager manager = (ConnectivityManager) context.getSystemService(Context.CONNECTIVITY_SERVICE);
if (manager != null) {
NetworkInfo info = manager.getActiveNetworkInfo();
if (info != null && info.isConnected()) {
networkAvailable = true;
}
答案 5 :(得分:0)
我一直在寻找一种有效的解决方案,以了解设备是否可以访问移动网络(而非数据网络)。
维克多的答案是一个非常有效的解决方案:https://stackoverflow.com/a/6760761/11024162
如果仅在某个特定时刻需要服务状态,则可以在onServiceStateChanged回调中注销侦听器。像这样:
private inner class PhoneListener : PhoneStateListener(){
override fun onServiceStateChanged(serviceState: ServiceState?) {
if (serviceState?.state != ServiceState.STATE_IN_SERVICE) {
//Behavior when no mobile network
}
//unregister listener after one callback call
//phoneListener is the PhoneListener you previously create to register listener
val tel = requireContext().getSystemService(Context.TELEPHONY_SERVICE) as TelephonyManager
tel.listen(phoneListener, PhoneStateListener.LISTEN_NONE)
}
}