Qt에서 Java를 활용한 Android 기기 MAC 주소 획득 방법 (Android 9.0)

개요

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 주소 조회 기능을 호출하는 방식으로 구현한다.

태그: Qt Android java MAC주소 Qt Android

7월 11일 20:45에 게시됨