我正在开发一个SMS应用程序,并且想要检查网络(蜂窝)连接。在API级别29中,检查连接需要使用ConnectivityManager.NetworkCallback
。我所管理的是让“ onAvailable()”在网络可用时通知我。但是,这也会通知我它是否连接到WiFi(因此我无法发送短信,但如果WiFI连接,则onAvailable()会触发)。
我尝试了onCapabilitiesChanged()
和.hasTransport(TRANSPORT_CELLULAR)
,但是如果我连接到WiFi,则报告为false。
我还想尝试hasCapability(NET_CAPABILITY_MMS)
,但这会通知是否可以使用MMS。我不清楚是否存在可以使用SMS而不使用MMS的场景/网络?我可以得到此报告false
,因为网络不支持MMS,但仍然可以发送SMS吗?
检查蜂窝网络是否可用的正确方法是什么?
答案 0 :(得分:0)
也许您可以尝试以下
Network activeNetwork = connectivityManager.getActiveNetwork();
NetworkCapabilities caps = connectivityManager.getNetworkCapabilities(activeNetwork);
boolean cellular = caps.hasTransport(NetworkCapabilities.TRANSPORT_CELLULAR);
if(cellular){
// do your stuff
}
答案 1 :(得分:0)
尝试使用以下代码检查设备是否已连接到互联网。
ConnectivityManager conMgr = (ConnectivityManager) getSystemService(Context.CONNECTIVITY_SERVICE);
NetworkInfo netInfo = conMgr.getActiveNetworkInfo();
if (netInfo == null) {
Toast.makeText(this, "Please turn on Internet ", Toast.LENGTH_SHORT).show();
} else {
//do what you want
}
答案 2 :(得分:0)
您需要使用网络回调。
try {
ConnectivityManager connectivityManager = (ConnectivityManager) context.getSystemService(Context.CONNECTIVITY_SERVICE);
NetworkRequest.Builder builder = new NetworkRequest.Builder();
connectivityManager.registerNetworkCallback(builder.build(),new ConnectivityManager.NetworkCallback() {
@Override
public void onAvailable(Network network) {
Variables.isNetworkConnected = true; // Global Static Variable
}
@Override
public void onLost(Network network) {
Variables.isNetworkConnected = false; // Global Static Variable
}
}
);
Variables.isNetworkConnected = false;
}catch (Exception e){
Variables.isNetworkConnected = false;
}
Variables.isNetworkConnected -在这里,我使用了全局静态变量,因此可以使用它来访问应用程序的任何软件中的网络状态。
有关完整的代码实现,请参考this gist。
答案 3 :(得分:0)
晚了,我不确定29岁...我觉得这很it脚...但这是我的做法:
public boolean isCellularAvailable()
{
TelephonyManager telephonyManager = (TelephonyManager)context.getSystemService(Context.TELEPHONY_SERVICE);
String opetarorName = telephonyManager.getNetworkOperatorName();
Log.i(LOG_TAG, "#### isCellularAvailable(): NetworkOperatorName is: " + opetarorName );
if (opetarorName .compareTo("") == 0)
{
Log.i(LOG_TAG, "#### isCellularAvailable(): NOPE");
Toast.makeText(context, "Turn off airplane mode and try again :)", Toast.LENGTH_LONG).show();
return false;
}
else
{
Log.i(LOG_TAG, "#### isCellularAvailable(): YES!");
return true;
}
}
这里的想法是,如果您连接到蜂窝网络,则应该能够获得网络提供商的名称。
如果您获得一个名称,则说明您已连接到该网络,并且应该能够使用它。
如果您在飞行模式下,您将不会连接到网络,也不会获得名称。
请注意,文档中指出“结果在CDMA网络上可能不可靠”……无论如何。
但是“ telephonyManager”提供了一些类似的功能,例如如果您知道自己是有利的网络类型,则“ getNetworkType()”可能是另一种选择:
public boolean isCellularAvailable()
{
TelephonyManager telephonyManager = (TelephonyManager)context.getSystemService(Context.TELEPHONY_SERVICE);
int networkType = telephonyManager.getNetworkType();// .getNetworkOperatorName();
Log.i(LOG_TAG, "#### isCellularAvailable(): Network type is: " + networkType);
switch (networkType)
{
// Return true for networks that suits your purpose
case TelephonyManager.NETWORK_TYPE_1xRTT: return true;
case TelephonyManager.NETWORK_TYPE_CDMA: return true;
case TelephonyManager.NETWORK_TYPE_EDGE: return true;
case TelephonyManager.NETWORK_TYPE_EHRPD: return true;
case TelephonyManager.NETWORK_TYPE_EVDO_0: return true;
case TelephonyManager.NETWORK_TYPE_EVDO_A: return true;
case TelephonyManager.NETWORK_TYPE_EVDO_B: return true;
case TelephonyManager.NETWORK_TYPE_GPRS: return true;
case TelephonyManager.NETWORK_TYPE_GSM: return true;
case TelephonyManager.NETWORK_TYPE_HSDPA: return true;
case TelephonyManager.NETWORK_TYPE_HSPA: return true;
case TelephonyManager.NETWORK_TYPE_HSPAP: return true;
case TelephonyManager.NETWORK_TYPE_HSUPA: return true;
case TelephonyManager.NETWORK_TYPE_IDEN: return true;
case TelephonyManager.NETWORK_TYPE_IWLAN: return true;
case TelephonyManager.NETWORK_TYPE_LTE: return true;
//case TelephonyManager.NETWORK_TYPE_NR: return true; // Not supported by my API
case TelephonyManager.NETWORK_TYPE_TD_SCDMA: return true;
case TelephonyManager.NETWORK_TYPE_UMTS: return true;
// Return false for unacceptable networks, UNKNOWN id no network e.g. airplane mode.
case TelephonyManager.NETWORK_TYPE_UNKNOWN: return false;
// Future unknown network types, handle as you please.
default: return false;
}