2011-09-27 15 views
5

Estoy tratando de encontrar una manera confiable de saber si un dispositivo Android es solo wifi. Intenté un par de formas:¿Hay alguna forma de saber si un dispositivo Android es solo wifi?

- Trato de obtener el ID del dispositivo (IMEI/MEID), si no puedo obtener el número IMEI/MEID, entonces puedo asumir que el dispositivo es solo wifi. Esto no funciona, ya que algunos teléfonos no devuelven una identificación de dispositivo cuando se ponen en modo de vuelo. - Intente leer TelephonyManager.getPhoneType. Esto tampoco funciona, ya que el dispositivo wifi solo con el que estoy probando devuelve PHONE_TYPE_GSM, mientras que espero que devuelva PHONE_TYPE_NONE.

Me pregunto si alguien ha distinguido con éxito los dispositivos solo wifi y los que no son solo wifi.

Respuesta

4

Puede consultar las características del sistema en su aplicación para ver si eso funciona.

PackageManager pm = getPackageManager(); 
boolean isAPhone = pm.hasSystemFeature(PackageManager.FEATURE_TELEPHONY); 

Si se preocupan por GSM/CDMA utilizan la más específica FEATURE_TELEPHONY_GSM o FEATURE_TELEPHONY_CDMA.

Si el dispositivo está acostado, por supuesto no hay mucho que pueda hacer afaik.

+1

Desafortunadamente, mi dispositivo wifi solo piensa que es un teléfono GSM. Estoy considerando combinar el valor de IMEI/MEID y el modo Avión para decidir - Si no puedo recuperar IMEI/MEID y el modo Avión está desactivado, entonces lo considero un dispositivo solo wifi. La forma en que recupero el modo avión está utilizando Settings.System.getInt (context.getContentResolver(), \t Settings.System.AIRPLANE_MODE_ON, 0)! = 0; El modo de avión vuelve a Desactivado en mi dispositivo de prueba solo wifi. No estoy seguro de si se comportará igual en otros dispositivos con wifi solo ... – user967113

+0

En mi dispositivo no tengo el módulo gsm (dispositivo wifi solamente), pero 'pm.hasSystemFeature (PackageManager.FEATURE_TELEPHONY);' regresar verdadero. –

2

Siguiendo solución funcionó para mí mejor:

TelephonyManager mgr = (TelephonyManager)ctx.getSystemService(Context.TELEPHONY_SERVICE); 
return mgr.getPhoneType() != TelephonyManager.PHONE_TYPE_NONE; 

Y después no funcionaba en algunos dispositivos como el Nook Tablet:

PackageManager pm = ctx.getPackageManager(); 
return pm.hasSystemFeature(PackageManager.FEATURE_TELEPHONY); 
0

Tengo un problema similar al suyo y he comprobado varias soluciones . Solo uno de ellos funciona confiablemente hasta ahora

if (mContext.getSystemService(Context.TELEPHONY_SERVICE) == null) { 
    // wifi-only device 
} 

Esta suposición es incorrecta. Mi Nexus 7 solo wifi devuelve un objeto de Administrador de telefonía.

mContext.getPackageManager().hasSystemFeature(PackageManager.FEATURE_TELEPHONY) 

Esto devuelve falsa en tanto mi Nexus 7. Uno de ellos es compatible con conexiones de datos y el otro es sólo WiFi

TelephonyManager telMgr = mContext.getSystemService(Context.TELEPHONY_SERVICE) 
telMgr.getPhoneType() 

espero PHONE_TYPE_NONE para el Nexus 7, que es sólo WiFi y PHONE_TYPE_GSM para el otro Nexus 7. llego PHONE_TYPE_NONE tanto para Nexus 7

if(telMgr.getSimState() == TelephonyManager.SIM_STATE_UNKNOWN) { 
    // Wifi-only device 
} 
else if (telMgr.getSimState() == TelephonyManager.SIM_STATE_ABSENT) { 
    // Device that supports data connection, but no SIM card present 
} 

Esta solución me preocupa. SIM_STATE_UNKNOWN también se usa durante las transiciones de estado. Además, algunos dispositivos admiten conexiones de datos pero no tienen una tarjeta SIM.

Mi solución favorita es la siguiente

ConnectivityManager mConMgr = mContext.getSystemService(Context.CONNECTIVITY_SERVICE) 
if (mConMgr.getNetworkInfo(ConnectivityManager.TYPE_MOBILE) == null) { 
    //wifi-only device 
} 

Lo único que me preocupa es si hay dispositivos que soportan TYPE_MOBILE_HIPRI o TYPE_MOBILE_MMS pero no TYPE_MOBILE Sospecho que esto no es el caso.

Cuestiones relacionadas