2015-09-23 10 views
6

私は...私のアプリで一部のデバイスでpingが動作するのはなぜですか?

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

を次のコードを持っている...と私はそれはいくつかのデバイス(例えばモトローラG)上の(0を返します)動作しますが、(リターンを動作しないことを見ています2)他のデバイス(例えば、Galaxy S3)上で。私はGalaxy S3デバイスを確認しましたが、確かに "/ system/bin/ping"ファイルがあります。もちろん、インターネットに接続されていることを確認しました。

誰でも何らかの理由でコマンドがでない場合は、がいくつかのデバイスで動作します。これを動作させるには何ができるのですか?

+0

ルーテッドデバイスでテストしましたか? –

+0

いいえ私はこれをルートにされていないデバイスでも動作させる方法を模索しています。 –

+0

あなたはどんな解決策ですか? –

答えて

16

各OEM(Original Equipment Manufacturer)でpingが実装される方法は異なる場合があります。これはpingに限られていません。たとえば、古いSamsungデバイス(S3)やadbシェルの新しいデバイス(Motorola G)でlinux duコマンドを実行してみてください。

S3はduをサポートしていますが、Moto GやSamsungデバイス(Galaxy S5以降)などの新しいデバイスはサポートしていますが、-m(メガバイト単位の表示)などのパラメータは必要ありません。 S3内のadbシェルでping -c 1 8.8.8.8を実行してみてください。これはあなたのJavaコードではなくOEMであることに注意してください。

また、dumpsysなどのコマンドでも、Androidのバージョンとデバイスによって出力形式が異なります。このため、完全に異なる方法を使用して、OEMごとに異なるサポートが可能なパラメータを持つプロセスを使用するのではなく、Androidで提供されるAPIを使用して目的のIPにpingを実行することができれば最適です。

権限はデバイスごとに異なる場合もあります。

アプリケーション内でプロセスを実行すると、そのプロセスに対してアプリケーションの限定された権限のみが付与されます。したがって、pingが(特定のデバイス上で)ルートレベルのアクセス権を必要とする場合、それが動作しない理由でもあります。彼らはAndroidをどのようにカスタマイズするのかは、最終的にはOEMの責任です。

出典:私はOEMで働いています。

+0

ちょっと "ping -c 1 8.8の実行方法を教えてもらえますか?私は同じ問題に直面している。 4.2.2デバイスで作業する際のping(作業に25000ms以上の時間がかかる場合)どうすればこの問題を解決できますか? –

+0

Punitでは、 'ping'コマンドをすべてのAndroidデバイスで確実に呼び出すことはできません。 –

+0

この問題を解決するには 私はこの行 "runtime.exec(" ping -c 1 "+ url)を使用していますが、4.2.2デバイスでは機能していないし、他のデバイスでも同じように動作しているので、 –

関連する問題