안드로이드에서 외부 IP 핑(Ping) 테스트하기
이 예제는 자바(Java) 기반 안드로이드 앱에서 외부 IP 주소에 핑을 보내 실제 인터넷 연결 여부를 확인하는 방법을 소개합니다. 단순히 네트워크가 연결되어 있는지(Wi-Fi 또는 모바일 데이터)만 판단하는 것이 아니라, 구글 서버와 같은 외부 호스트에 실제로 도달할 수 있는지까지 검증할 수 있습니다.
1단계: 새 프로젝트 만들기
Android Studio에서 File → New Project를 선택하고, 필요한 정보를 모두 입력해 새 프로젝트를 생성합니다.
2단계: 레이아웃 파일 작성
res/layout/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>3단계: 메인 액티비티 코드 작성
src/MainActivity.java 파일에 아래 코드를 추가합니다. 이 코드는 현재 네트워크 상태(Wi-Fi, 모바일 데이터, 연결 없음)를 먼저 확인한 후, 구글 서버에 핑을 보내 실제 연결 가능 여부를 검사합니다.
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);
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) {
if (isWiFi) {
Toast.makeText(this, "Yes, WiF",
Toast.LENGTH_SHORT)
.show();
if(isConnectedToThisServer("https://www.google.com/")) {
Toast.makeText(this, "Yes, Connected to
Google", Toast.LENGTH_SHORT)
.show();
} else {
Toast.makeText(this, "No Google
Connection", Toast.LENGTH_SHORT)
.show();
}
}
if (isMobile) {
Toast.makeText(this, "Yes, Mobile",
Toast.LENGTH_SHORT)
.show();
if(isConnectedToThisServer("https://www.google.com/")) {
Toast.makeText(this, "Yes, Connected to
Google", Toast.LENGTH_SHORT).show();
} else {
Toast.makeText(this, "No Google
Connection", Toast.LENGTH_SHORT).show();
}
}
} else {
Toast.makeText(this, "No Network",
Toast.LENGTH_SHORT).show();
}
}
public boolean isConnectedToThisServer(String host) {
Runtime runtime = Runtime.getRuntime();
try {
Process ipProcess = runtime.exec("/system/bin/ping
-c 1 8.8.8.8" + host);
int exitValue = ipProcess.waitFor();
return (exitValue == 0);
} catch (IOException e) {
e.printStackTrace();
} catch (InterruptedException e) {
e.printStackTrace();
}
return false;
}
}4단계: 매니페스트 권한 설정
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>앱 실행 및 결과 확인
이제 애플리케이션을 실행해 결과를 확인해 보겠습니다. 실제 안드로이드 기기를 컴퓨터에 연결했다고 가정합니다. Android Studio에서 프로젝트의 액티비티 파일 중 하나를 연 뒤, 툴바에서 Run 아이콘을 클릭하세요. 실행 옵션에서 본인의 모바일 기기를 선택하면, 기본 화면과 함께 네트워크 연결 상태가 토스트 메시지로 표시됩니다.


참고 사항
위 예제는 Runtime.exec()를 통해 시스템의 ping 명령어를 직접 호출하는 방식입니다. 일부 기기나 Android 버전에서는 이 명령어 경로가 존재하지 않거나 제한될 수 있으므로, 최신 프로젝트에서는 InetAddress.getByName(host).isReachable(timeout) 방식을 대안으로 고려하는 것이 좋습니다. 또한 네트워크 작업은 메인 스레드가 아닌 백그라운드 스레드에서 처리하는 것이 권장됩니다.