2011-09-27 10 views
5

Sto cercando di trovare un modo affidabile per sapere se un dispositivo Android è solo wifi. Ho provato un paio di modi:C'è un modo per dire se un dispositivo Android è solo wifi?

- Prova a ottenere l'ID del dispositivo (IMEI/MEID), se non riesco a ottenere il numero IMEI/MEID, quindi posso supporre che il dispositivo è solo wifi. Questo non funziona in quanto alcuni telefoni non restituiscono un ID dispositivo quando vengono messi in modalità aereo. - Prova a leggere TelephonyManager.getPhoneType. Questo non funziona in quanto il dispositivo solo wifi che sto testando restituisce PHONE_TYPE_GSM, mentre mi aspetto che restituisca PHONE_TYPE_NONE.

Mi chiedo se qualcuno abbia distinto con successo i dispositivi solo wifi e quelli non wifi.

risposta

4

È possibile interrogare le funzioni di sistema nella propria app per vedere se funziona.

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

Se vi preoccupate per GSM/CDMA utilizzare il più specifica FEATURE_TELEPHONY_GSM o FEATURE_TELEPHONY_CDMA.

Se il dispositivo è steso, naturalmente non c'è molto che si possa fare afaik.

+1

Purtroppo il mio dispositivo solo wifi pensa che sia un telefono GSM. Sto pensando di combinare il valore di IMEI/MEID e modalità aereo per decidere - Se non riesco a recuperare IMEI/MEID e la modalità aereo è Off, quindi considero un dispositivo solo wifi. Il modo in cui recupero la modalità aereo utilizza Settings.System.getInt (context.getContentResolver(), \t Settings.System.AIRPLANE_MODE_ON, 0)! = 0; La modalità aereo ritorna disattivata sul mio dispositivo di prova solo wifi. Non sono sicuro se si comporterà lo stesso su altri dispositivi solo wifi ... – user967113

+0

Nel mio dispositivo non ho il modulo gsm (dispositivo wifi-only), ma 'pm.hasSystemFeature (PackageManager.FEATURE_TELEPHONY);' ritorna vero –

2

seguente soluzione ha funzionato per me meglio:

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

E dopo non funzionava su pochi dispositivi come Nook Tablet:

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

Ho un problema simile al tuo e ho verificato diverse soluzioni . Solo uno di essi funziona in modo affidabile finora

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

Questa ipotesi è errata. Il mio Nexus 7 wifi-only restituisce un oggetto Telephony Manager.

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

Questo restituisce false sia sul mio Nexus 7. Uno di loro supporta connessioni dati e l'altro è solo WiFi

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

mi aspetto PHONE_TYPE_NONE per il Nexus 7 che è WiFi-only e PHONE_TYPE_GSM per l'altro Nexus 7. ottengo PHONE_TYPE_NONE sia per 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 
} 

Questa soluzione mi preoccupa. SIM_STATE_UNKNOWN viene utilizzato anche durante le transizioni di stato. Inoltre, alcuni dispositivi supportano connessioni dati ma non hanno una scheda SIM.

La mia soluzione preferita è la seguente

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

L'unica cosa che mi preoccupa è se ci sono dispositivi che supportano TYPE_MOBILE_HIPRI o TYPE_MOBILE_MMS ma non TYPE_MOBILE ho il sospetto che questo non è il caso.

Problemi correlati