Runtime.exec() এবং Ping কমান্ড ব্যবহার করে নেটওয়ার্ক কানেক্টিভিটি চেক করা
অ্যান্ড্রয়েডে জাভা থেকে এক্সটার্নাল IP বা হোস্ট পিং করার জন্য `Runtime.getRuntime().exec()` ব্যবহার করে সিস্টেম পিং কমান্ড চালানো হয়। এটি নেটওয়ার্ক কানেক্টিভিটি যাচাই করার একটি পদ্ধতি।
ধাপ ১: প্রজেক্ট তৈরি করুন
স্ট্যান্ডার্ড অ্যান্ড্রয়েড প্রজেক্ট।
ধাপ ২: সিম্পল লেআউট
res/layout/activity_main.xml - শুধু একটি TextView:
<?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>
ধাপ ৩: পিং এবং নেটওয়ার্ক চেক লজিক
src/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) 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" : "Mobile";
Toast.makeText(this, "Connected via " + networkType, Toast.LENGTH_SHORT).show();
// গুগল DNS (8.8.8.8) পিং করুন
if (isConnectedToServer("8.8.8.8")) {
Toast.makeText(this, "Internet accessible (Google DNS reachable)", Toast.LENGTH_SHORT).show();
} else {
Toast.makeText(this, "No internet connection (DNS unreachable)", Toast.LENGTH_SHORT).show();
}
} else {
Toast.makeText(this, "No Network Connection", Toast.LENGTH_SHORT).show();
}
}
public boolean isConnectedToServer(String host) {
Runtime runtime = Runtime.getRuntime();
try {
// পিং কমান্ড: -c 1 = ১বার পিং, -W 3 = ৩ সেকেন্ড টাইমআউট
String command = "/system/bin/ping -c 1 -W 3 " + host;
Process ipProcess = runtime.exec(command);
int exitValue = ipProcess.waitFor();
return (exitValue == 0); // ০ = সাফল্য
} catch (IOException | InterruptedException e) {
e.printStackTrace();
return false;
}
}
}
ধাপ ৪: প্রয়োজনীয় পারমিশন
AndroidManifest.xml:
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" /> <uses-permission android:name="android.permission.INTERNET" />
গুরুত্বপূর্ণ বিবেচনা
⚠️ সীমাবদ্ধতা:
/system/bin/pingসব ডিভাইসে থাকতে পারে না (রুট বা নির্দিষ্ট বিল্ডে)- SELinux পলিসি পিং এক্সিকিউশন ব্লক করতে পারে
- মেইন থ্রেডে ব্লকিং কল (`waitFor()`) - ANR হতে পারে
- ICMP পিং ব্লক করা ফায়ারওয়াল/রাউটারে কাজ করে না
উন্নত পদ্ধতি: InetAddress (ICMP ছাড়া)
public boolean isHostReachable(String host, int timeoutMs) {
try {
return InetAddress.getByName(host).isReachable(timeoutMs);
} catch (IOException e) {
return false;
}
}
// অ্যাসিনক্রোনাস.version (কoretoutines/RxJava)
Completable.fromAction(() -> {
boolean reachable = InetAddress.getByName("8.8.8.8").isReachable(3000);
// UI আপডেট
}).subscribeOn(Schedulers.io()).observeOn(AndroidSchedulers.mainThread()).subscribe();
NetworkCallback API (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(@NonNull Network network) {
// ইন্টারনেট উপলব্ধ
}
@Override
public void onLost(@NonNull Network network) {
// ইন্টারনেট হারিয়ে গেছে
}
});