2015-09-23 16 views
6

Ho il seguente codice nel mio app ...Perché il ping funziona su alcuni dispositivi e non su altri?

Runtime runtime = Runtime.getRuntime(); 
Process process = runtime.exec("/system/bin/ping -c 1 8.8.8.8"); 
return process.waitFor(); 

... e sto vedendo che funziona (restituisce 0) su alcuni dispositivi (ad esempio Motorola G), ma non funziona (i rendimenti 2) su altri dispositivi (ad esempio Galaxy S3). Ho controllato il dispositivo Galaxy S3 e sicuramente ha un file "/ system/bin/ping" e ovviamente mi sono assicurato che sia effettivamente connesso a Internet.

Qualcuno ha qualche idea del perché il comando potrebbe non funzionare su alcuni dispositivi ... e cosa posso fare per farlo funzionare?

+0

Lo hai testato su dispositivi rooted? –

+0

No. Sto cercando un modo per farlo funzionare su dispositivi non-rooted. –

+0

qualsiasi soluzione ottieni? –

risposta

16

Il modo in cui il ping viene implementato per ogni OEM (Original Equipment Manufacturer) può essere diverso. Questo non è solo limitato al ping. Ad esempio, prova a eseguire il comando linux du sui vecchi dispositivi Samsung (S3) e sui dispositivi più recenti (Motorola G) sulla shell adb.

L'S3 supporta du, ma non richiede alcuni parametri come -m (visualizzazione in megabyte), mentre i dispositivi più recenti come Moto G o anche dispositivi Samsung (passato Galaxy S5) lo supportano. Prova a eseguire ping -c 1 8.8.8.8 sulla shell adb all'interno di S3 e noterai che non è il tuo codice Java, è l'OEM.

Anche in questo caso, anche i comandi come i dumpsys hanno un output formattato in modo diverso a seconda della versione di Android e del dispositivo. Per questo motivo, sarebbe meglio se fosse possibile utilizzare un metodo completamente diverso per provare a eseguire il ping dell'IP desiderato utilizzando le API fornite in Android anziché utilizzare un processo con parametri che potrebbero essere diversamente supportati per OEM.

È inoltre possibile che le autorizzazioni siano diverse per dispositivo.

Quando si esegue un processo all'interno della propria app, si concedono le autorizzazioni limitate dell'app solo al processo. Quindi, se il ping richiede l'autorizzazione di livello root (sul dispositivo specifico), questo potrebbe anche essere il motivo per cui non funziona. In ultima analisi, spetta all'OEM il modo in cui hanno personalizzato Android.

Origine: Lavoro presso un OEM.

+0

Ehi, puoi spiegarmi come eseguire "ping -c 1 8.8 .8.8 su adb shell "visto che sto affrontando lo stesso problema. ping su lavorare su dispositivo 4.2.2 (se lavori richiedono più tempo allora 25000ms) come posso risolvere questo ?? –

+0

Punit, il comando 'ping' non può essere chiamato in modo affidabile su tutti i dispositivi Android. –

+0

quindi come risolvere questo problema mentre sto usando questa riga "runtime.exec (" ping -c 1 "+ url)" ma non funziona per i dispositivi 4.2.2 e funziona abbastanza bene per altri dispositivi –