据我所知,发送ICMP回应请求需要 根 (即做它需要的setuid应用程序) -这 不是
当前可能在“股票”的Android(地狱,甚至InetAddress类#isReachable()在Android的方法是一个笑话那并不是”不能按规格工作)。
一个使用/ usr / bin / ping&Process的非常基本的示例-使用AsyncTask读取ping结果:
public class PingActivity extends Activity { PingTask mTask; @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.main); } @Override protected void onResume() { super.onResume(); mTask = new PingTask(); // Ping the host "android.com" mTask.execute("android.com"); } @Override protected void onPause() { super.onPause(); mTask.stop(); } class PingTask extends AsyncTask<String, Void, Void> { PipedOutputStream mPOut; PipedInputStream mPIn; LineNumberReader mReader; Process mProcess; TextView mText = (TextView) findViewById(R.id.text); @Override protected void onPreExecute() { mPOut = new PipedOutputStream(); try { mPIn = new PipedInputStream(mPOut); mReader = new LineNumberReader(new InputStreamReader(mPIn)); } catch (IOException e) { cancel(true); } } public void stop() { Process p = mProcess; if (p != null) { p.destroy(); } cancel(true); } @Override protected Void doInBackground(String... params) { try { mProcess = new ProcessBuilder() .command("/system/bin/ping", params[0]) .redirectErrorStream(true) .start(); try { InputStream in = mProcess.getInputStream(); OutputStream out = mProcess.getOutputStream(); byte[] buffer = new byte[1024]; int count; // in -> buffer -> mPOut -> mReader -> 1 line of ping information to parse while ((count = in.read(buffer)) != -1) { mPOut.write(buffer, 0, count); publishProgress(); } out.close(); in.close(); mPOut.close(); mPIn.close(); } finally { mProcess.destroy(); mProcess = null; } } catch (IOException e) { } return null; } @Override protected void onProgressUpdate(Void... values) { try { // Is a line ready to read from the "ping" command? while (mReader.ready()) { // This just displays the output, you should typically parse it I guess. mText.setText(mReader.readLine()); } } catch (IOException t) { } } }}


