2015-09-23 13 views
6

Ich habe den folgenden Code in meiner app ...Warum funktioniert Ping auf einigen Geräten und nicht auf anderen?

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

... und ich sehe, dass es funktioniert (0 zurück) auf einigen Geräten (zB Motorola G), funktioniert aber nicht (Renditen 2) auf anderen Geräten (z. B. Galaxy S3). Ich habe das Galaxy S3 Gerät überprüft und es hat definitiv eine "/ system/bin/ping" Datei und natürlich habe ich sichergestellt, dass es tatsächlich mit dem Internet verbunden ist.

Jeder hat irgendwelche Ideen, warum der Befehl möglicherweise nicht Arbeit auf einigen Geräten ... und was kann ich tun, um es zum Laufen zu bringen?

+0

Haben Sie es auf gerooteten Geräten getestet? –

+0

Nein. Ich suche nach einer Möglichkeit, dies auf nicht gerooteten Geräten zu erreichen. –

+0

jede Lösung, die Sie bekommen? –

Antwort

16

Die Art und Weise, wie Ping für jeden OEM (Original Equipment Manufacturer) implementiert wird, kann unterschiedlich sein. Dies ist nicht nur auf Ping beschränkt. Versuchen Sie beispielsweise, den Befehl linux du auf alten Samsung-Geräten (S3) und neueren Geräten (Motorola G) in der adb-Shell auszuführen.

Die S3 unterstützt du, aber es braucht nicht einige Parameter wie -m (Anzeige in Megabyte), während neuere Geräte wie Moto G oder sogar Samsung-Geräte (Vergangenheit Galaxy S5) es unterstützt. Versuchen Sie, ping -c 1 8.8.8.8 auf adb shell in S3 auszuführen, und Sie werden feststellen, dass es sich nicht um Ihren Java-Code handelt, sondern um den OEM.

Wiederum haben selbst Befehle wie Dumpsys unterschiedlich formatierte Ausgaben, abhängig von Android Version und Gerät. Aus diesem Grund wäre es am besten, wenn Sie eine völlig andere Methode verwenden können, um die gewünschte IP mit den in Android bereitgestellten APIs zu pingen, anstatt einen Prozess mit Parametern zu verwenden, die je nach OEM unterschiedlich unterstützt werden.

Es kann auch sein, dass die Berechtigungen für jedes Gerät unterschiedlich sind.

Wenn Sie einen Prozess in Ihrer App ausführen, gewähren Sie dem Prozess nur eingeschränkte Berechtigungen für die App. Wenn also Ping Root-Rechte erfordert (auf dem jeweiligen Gerät), kann dies auch der Grund sein, warum es nicht funktioniert. Letztlich liegt es an den OEM, wie sie Android angepasst haben.

Quelle: Ich arbeite bei einem OEM.

+0

Hey Kannst du mir erklären, wie man "ping -c 1 8.8 .8.8 auf adb shell ", da ich mit dem gleichen Problem konfrontiert bin. ping am 4.2.2 Gerät arbeiten (wenn Arbeiten mehr Zeit als 25000ms dauern) wie kann ich das lösen ?? –

+0

Punit, der Befehl 'ping' kann nicht zuverlässig auf allen Android-Geräten aufgerufen werden. –

+0

dann, wie dieses Problem zu lösen, da ich diese Zeile "runtime.exec (" ping -c 1 "+ URL)" aber es funktioniert nicht für 4.2.2 Geräte und das gleiche funktioniert ziemlich gut für andere Geräte –