我想检测设备是否具有移动数据功能。通过移动数据功能,我不是指活动或连接的移动数据连接,而是指使用移动数据的能力。
我目前使用以下
if (getPackageManager().hasSystemFeature(PackageManager.FEATURE_TELEPHONY)) {
//I assume device has mobile data capability
}
这适用于大多数情况,但只有一个 - 如果设备没有呼叫设施但能够利用蜂窝网络进行数据连接。此类设备通常是具有SIM卡插槽的平板电脑,但它只能用于数据连接,而不能用于呼叫。
在这种情况下以及在所有其他情况下,如何检测设备是否具有移动数据功能?什么是最好的方法?
答案 0 :(得分:5)
我自己找到了解决方案。将它发布给可能需要它的其他人。
ConnectivityManager cm = (ConnectivityManager)
getSystemService(Context.CONNECTIVITY_SERVICE);
NetworkInfo ni = cm
.getNetworkInfo(ConnectivityManager.TYPE_MOBILE);
if (ni == null) {
// Device does not have mobile data capability
}
来自getNetworkInfo(int networkType)的文档:
参数: networkType整数,指定您感兴趣的网络类型。
返回:所请求网络类型的NetworkInfo对象或 null 如果设备不支持该类型。这种方法需要 呼叫者持有权限 android.Manifest.permission.ACCESS_NETWORK_STATE。
此方法可以扩展为检查其他类型的网络。只需将所需的networkType放入getNetworkInfo()。
就个人而言,我只是在执行此测试时
getPackageManager().hasSystemFeature(PackageManager.FEATURE_TELEPHONY)
返回false。然后,此检查可以确认设备是否具有移动数据功能,即使它没有电话功能(某些平板电脑就是这种情况)。如果设备有FEATURE_TELEPHONY,我认为它具有移动数据功能。这样我们可以在大多数情况下减少执行时间。
答案 1 :(得分:0)
嗯我还没有测试过这个,但如果它有数据连接,那么它在网络上的位置可能已启用,因此你可以使用FEATURE_LOCATION_NETWORK
答案 2 :(得分:0)
使用ConnectivityManager
和NetworkInfo
检查当前的连接状态:
ConnectivityManager cm = (ConnectivityManager) context
.getSystemService(Context.CONNECTIVITY_SERVICE);
NetworkInfo eventInfo = cm.getActiveNetworkInfo();
//first check to see if an active connection exists
if (eventInfo != null
&& eventInfo.getState() == NetworkInfo.State.CONNECTED) {
//now checks for the type of connection
switch(eventInfo.getType()) {
case ConnectivityManager.TYPE_MOBILE:
case ConnectivityManager.TYPE_MOBILE_DUN:
case ConnectivityManager.TYPE_MOBILE_HIPRI:
case ConnectivityManager.TYPE_MOBILE_MMS:
case ConnectivityManager.TYPE_MOBILE_SUPL:
//is mobile connection
break;
}
} else {
//device currently in a disconnected state, including connecting
}
* psudo代码,可能不会100%在copy& amp;糊