Ping địa chỉ IP bên ngoài từ Android Java
Hướng dẫn này minh họa cách kiểm tra kết nối mạng và ping đến máy chủ bên ngoài (Google DNS 8.8.8.8) từ ứng dụng Android.
Bước 1: Tạo dự án mới
Mở Android Studio, chọn File → New Project và điền thông tin cần thiết.
Bước 2: Thiết kế giao diện (activity_main.xml)
<?xml version="1.0" encoding="utf-8"?>
<android.support.constraint.ConstraintLayout
xmlns:android="https://schemas.android.com/apk/res/android"
xmlns:app="https://schemas.android.com/apk/res-auto"
xmlns:tools="https://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:context=".MainActivity">
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="Hello World!"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintLeft_toLeftOf="parent"
app:layout_constraintRight_toRightOf="parent"
app:layout_constraintTop_toTopOf="parent" />
</android.support.constraint.ConstraintLayout>
Bước 3: Code MainActivity.java
import android.content.Context;
import android.net.ConnectivityManager;
import android.net.NetworkInfo;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.widget.Toast;
import java.io.IOException;
public class MainActivity extends AppCompatActivity {
Boolean isConnected = false, isWiFi = false, isMobile = false;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
checkNetworkAndPing();
}
private void checkNetworkAndPing() {
ConnectivityManager cm = (ConnectivityManager)
this.getSystemService(Context.CONNECTIVITY_SERVICE);
NetworkInfo activeNetwork = cm.getActiveNetworkInfo();
if (activeNetwork != null) {
isWiFi = activeNetwork.getType() == ConnectivityManager.TYPE_WIFI;
isMobile = activeNetwork.getType() == ConnectivityManager.TYPE_MOBILE;
isConnected = activeNetwork.isConnectedOrConnecting();
}
if (isConnected) {
String networkType = isWiFi ? "WiFi" : (isMobile ? "Mobile" : "Unknown");
Toast.makeText(this, "Connected: " + networkType, Toast.LENGTH_SHORT).show();
if (isConnectedToServer("8.8.8.8")) {
Toast.makeText(this, "Internet reachable (Google DNS)", Toast.LENGTH_SHORT).show();
} else {
Toast.makeText(this, "No Internet connection", Toast.LENGTH_SHORT).show();
}
} else {
Toast.makeText(this, "No Network Connection", Toast.LENGTH_SHORT).show();
}
}
// Ping dùng lệnh hệ thống /system/bin/ping
public boolean isConnectedToServer(String host) {
Runtime runtime = Runtime.getRuntime();
try {
// -c 1: chỉ ping 1 lần, -W 2: timeout 2 giây
Process ipProcess = runtime.exec("/system/bin/ping -c 1 -W 2 " + host);
int exitValue = ipProcess.waitFor();
return (exitValue == 0);
} catch (IOException | InterruptedException e) {
e.printStackTrace();
}
return false;
}
}
Bước 4: Cấu hình quyền trong AndroidManifest.xml
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="https://schemas.android.com/apk/res/android" package="app.com.sample">
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
<uses-permission android:name="android.permission.INTERNET" />
<application
android:allowBackup="true"
android:icon="@mipmap/ic_launcher"
android:label="@string/app_name"
android:roundIcon="@mipmap/ic_launcher_round"
android:supportsRtl="true"
android:theme="@style/AppTheme">
<activity android:name=".MainActivity">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
</application>
</manifest>
Chạy ứng dụng
Kết nối thiết bị, chạy app. Sẽ hiển thị Toast: loại kết nối (WiFi/Mobile) và có internet hay không.
⚠️ Vấn đề với cách dùng Runtime.exec("ping"):
- Không portable: đường dẫn
/system/bin/pingcó thể khác nhau - Chậm: tạo process mới, chờ timeout
- Không hoạt động trên một số thiết bị (SELinux, missing binary)
- Chặn main thread → ANR nếu timeout dài
Cách hiện đại tốt hơn: InetAddress.isReachable()
public boolean isReachableModern(String host, int timeoutMs) {
try {
InetAddress address = InetAddress.getByName(host);
return address.isReachable(timeoutMs);
} catch (IOException e) {
e.printStackTrace();
return false;
}
}
// Sử dụng trong background thread
new Thread(() -> {
boolean reachable = isReachableModern("8.8.8.8", 3000);
runOnUiThread(() -> Toast.makeText(this,
reachable ? "Online" : "Offline", Toast.LENGTH_SHORT).show());
}).start();
Cách tốt nhất: NetworkCallback (API 21+)
ConnectivityManager cm = (ConnectivityManager) getSystemService(CONNECTIVITY_SERVICE);
NetworkRequest request = new NetworkRequest.Builder()
.addCapability(NetworkCapabilities.NET_CAPABILITY_INTERNET)
.build();
cm.registerNetworkCallback(request, new ConnectivityManager.NetworkCallback() {
@Override
public void onAvailable(Network network) {
// Có kết nối internet
runOnUiThread(() -> Toast.makeText(MainActivity.this, "Online", Toast.LENGTH_SHORT).show());
}
@Override
public void onLost(Network network) {
// Mất kết nối
runOnUiThread(() -> Toast.makeText(MainActivity.this, "Offline", Toast.LENGTH_SHORT).show());
}
});
// Hủy đăng ký khi destroy
// cm.unregisterNetworkCallback(callback);
Kiểm tra kết nối thực tế (HTTP Request)
// Dùng OkHttp (khuyến khích)
OkHttpClient client = new OkHttpClient();
Request request = new Request.Builder()
.url("https://www.google.com/generate_204") // Google connectivity check
.build();
client.newCall(request).enqueue(new Callback() {
@Override
public void onFailure(Call call, IOException e) {
// Không có internet
}
@Override
public void onResponse(Call call, Response response) throws IOException {
if (response.code() == 204) {
// Có internet thực sự
}
}
});