玉律传佳节,青阳伴此辰。——(唐)冷朝阳《立春》
今天是2月3日,二十四节气中的第一个节气——立春。天气开始转暖,万物开始复苏。在这个充满希望的日子里,祝愿新冠疫情能够早日散去,藁城能够早日“搞成”,世界能够早日好起来。其实今天这篇博客没有太多的技术含量,就是感觉有些日子没发博客了,想写点东西,冒个泡,恰巧今天不算太忙,所以临时决定水一篇。
前一阵子有个任务,测试一个Android设备能不能ping通一个网站或者路由器。我的第一反应就是写一个小的APP,实现ping的功能,然后返回结果给图形界面,应该不难。百度一下之后,果然有相关的东西。本着“我们不生产代码,我们只做代码的搬运工”的原则,经过一番“搬运”,最终实现了功能。其实也没什么好说的,直接上代码吧!
import android.annotation.SuppressLint;
import android.os.Handler;
import android.os.Message;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.widget.TextView;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
public class MainActivity extends AppCompatActivity {
TextView pingContent;
String address = "10.1.23.1";
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
pingContent = findViewById(R.id.ping_content);
RunHandler();
}
public void startPing(String ip) {
int i = 0;
try {
Process p = Runtime.getRuntime().exec("ping -c 1 -w 100 " + ip, null, null);
int status = p.waitFor();
InputStream input = p.getInputStream();
BufferedReader in = new BufferedReader(new InputStreamReader(input));
StringBuffer buffer = new StringBuffer();
String line = "";
while ((line = in.readLine()) != null) {
buffer.append(line);
}
if (status == 0) {
i++;
pingContent.setText("Ping " + ip + "进行中... " + i);
} else {
pingContent.setText("Fail: IP addr not reachable");
}
} catch (IOException e) {
pingContent.setText("Fail: IOException" + e.getMessage());
} catch (InterruptedException e) {
pingContent.setText("Fail: InterruptedException" + e.getMessage());
}
}
@SuppressLint("HandlerLeak")
private void RunHandler() {
// 实时更新UI
final Handler mHandler = new Handler() {
public void handleMessage(Message msg) {
super.handleMessage(msg);
startPing(address);
}
};
Runnable mRunnable = new Runnable() {
public void run() {
while (true) {
try {
Thread.sleep(1000);
mHandler.sendMessage(mHandler.obtainMessage());
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
};
new Thread(mRunnable).start();
}
}
就新开了一个线程,一直在ping,根据返回的结果更新UI。
对了,APP还需要一些权限,具体需要什么我没有深究。我直接从之前一个需要联网的APP工程里把权限需求复制了过来,全都加上了。虽然简单粗暴了点,但是能拔脓的就是好膏药嘛。
<uses-permission android:name="android.permission.INTERNET" />
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" />
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />
<uses-permission android:name="android.permission.READ_PHONE_STATE" />
<uses-permission android:name="android.permission.CHANGE_WIFI_STATE" />
<uses-permission android:name="android.permission.ACCESS_WIFI_STATE" />
<uses-permission android:name="android.permission.CHANGE_CONFIGURATION" />
<uses-permission android:name="android.permission.MOUNT_UNMOUNT_FILESYSTEMS" />