개요
Qt 프레임워크를 사용하여 Android 애플리케이션을 개발할 때, 기기의 MAC 주소를 확인해야 하는 상황이 발생할 수 있다. Android 9.0 이상에서는 보안 정책의 변화로 인해 기존 방식의 접근이 제한적이다. 본 글에서는 Qt 환경에서 Java 코드를 활용하여 Android 기기의 MAC 주소를 가져오는 방법을 설명한다.
MAC 주소 획득 구현
다음은 Android 기기의 MAC 주소를 얻어오는 Java 코드이다. 이 구현은 네트워크 인터페이스를 순회하며 유효한 IP 주소에 해당하는 하드웨어 주소를 추출한다.
주요 메서드 구현
public String retrieveMacAddress() {
String macAddress = null;
try {
InetAddress localIp = fetchLocalInetAddress();
if (localIp != null) {
byte[] hardwareBytes = NetworkInterface.getByInetAddress(localIp)
.getHardwareAddress();
StringBuilder builder = new StringBuilder();
for (int idx = 0; idx < hardwareBytes.length; idx++) {
if (idx > 0) {
builder.append(':');
}
String hexValue = Integer.toHexString(hardwareBytes[idx] & 0xFF);
builder.append(hexValue.length() == 1 ? "0" + hexValue : hexValue);
}
macAddress = builder.toString().toUpperCase();
}
} catch (Exception exception) {
// 예외 처리
}
android.util.Log.d("MAC_INFO", "Retrieved MAC address: " + macAddress);
return macAddress;
}
위의 메서드는 로컬 IP 주소를 가져와서 해당 네트워크 인터페이스의 하드웨어 주소를 추출한다. 바이트 배열을 16진수 문자열로 변환할 때 각 바이트가 두 자리씩 표시되도록 패딩을 추가한다.
로컬 IP 주소 조회
private InetAddress fetchLocalInetAddress() {
InetAddress ipAddress = null;
try {
Enumeration<NetworkInterface> networkInterfaces = NetworkInterface
.getNetworkInterfaces();
while (networkInterfaces.hasMoreElements()) {
NetworkInterface networkIf = networkInterfaces.nextElement();
Enumeration<InetAddress> ipAddresses = networkIf.getInetAddresses();
while (ipAddresses.hasMoreElements()) {
InetAddress inetAddr = ipAddresses.nextElement();
if (!inetAddr.isLoopbackAddress()
&& inetAddr.getHostAddress().indexOf(":") == -1) {
ipAddress = inetAddr;
break;
}
}
if (ipAddress != null) {
break;
}
}
} catch (SocketException socketException) {
socketException.printStackTrace();
}
return ipAddress;
}
이 메서드는 시스템의 모든 네트워크 인터페이스를 열거하며, 루프백 주소가 아니고 IPv6 주소가 아닌 첫 번째 유효한 IP 주소를 반환한다.
대체 IP 주소 조회 방법
private String obtainLocalIpAddress() {
try {
for (Enumeration<NetworkInterface> interfaceList = NetworkInterface
.getNetworkInterfaces(); interfaceList.hasMoreElements(); ) {
NetworkInterface currentInterface = interfaceList.nextElement();
for (Enumeration<InetAddress> addressList = currentInterface
.getInetAddresses(); addressList.hasMoreElements(); ) {
InetAddress currentAddress = addressList.nextElement();
if (!currentAddress.isLoopbackAddress()) {
return currentAddress.getHostAddress().toString();
}
}
}
} catch (SocketException socketException) {
socketException.printStackTrace();
}
return null;
}
Android 9.0 이상 고려사항
Android 9.0 (API 레벨 28)부터는 MAC 주소 접근에 대한 제한이 강화되었다. 개발 시 다음 사항을 고려해야 한다:
- 일반 애플리케이션에서는 Wi-Fi MAC 주소 직접 접근이 불가능
- 시스템 애플리케이션 또는 특수 권한이 필요할 수 있음
- 대안으로 UUID나 Advertising ID 활용을 검토할 수 있음
Qt와의 연동
Qt Android 환경에서 위 Java 코드를 실행하려면 JNI(Java Native Interface) 또는 Qt Android Extras 모듈을 활용할 수 있다. Java 클래스를 AndroidActivity에 통합하여 MAC 주소 조회 기능을 호출하는 방식으로 구현한다.