2016-04-11 133 views
2

獲取MAC地址,我可以用這個C代碼獲取MAC地址:如何在Android原生代碼

struct ifreq s; 
char buffer[12 + 1]; 
int fd = socket(PF_INET, SOCK_DGRAM, IPPROTO_IP); 
int i, j; 
memset(buffer, 0 , sizeof(buffer)); 
strcpy(s.ifr_name, "wlan0"); 

if (0 == ioctl(fd, SIOCGIFHWADDR, &s)) { 
    memcpy(mac, s.ifr_addr.sa_data, 6); 
    return 1; 
} 

我想在Android中獲得MAC地址。但是這個代碼不給MAC地址。 if (0 == ioctl(fd, SIOCGIFHWADDR, &s)總是錯誤的。

我發現https://groups.google.com/d/msg/android-ndk/6Y-0Eid3mGw/6bFvtap8xJIJ

一個代碼,但這個代碼給出了錯誤:

ioctl(SIOCGIFHWADDR) error 

,它給像00:00:00:7C::00:01

錯誤的MAC地址,我如何能在Android原生代碼獲取MAC地址?

+1

僅供參考,使用此之前版本的Android M工作,考慮讓它在Java和傳遞。請參閱http://stackoverflow.com/questions/33159224/getting-mac-address-in-android-6-0(第五回答下降作品) – Michael

回答

0

您必須連接到WiFi網絡,然後嘗試獲取mac地址。

0

此代碼工作在Nexus 5好:

#include <stdio.h> 
#include <stdlib.h> 
#include <sys/socket.h> 
#include <linux/sockios.h> 
#include <linux/if.h> 
#include <linux/in.h> 


int get_mac_addr(char *mac_addr) 
{ 
    int sockfd; 
    struct ifreq ifr; 

    if ((sockfd = socket(AF_INET, SOCK_DGRAM, IPPROTO_IP)) >= 0) { 
    //strncpy(ifr.ifr_name, "eth0", IFNAMESIZE); 
    strncpy(ifr.ifr_name, "wlan0", IFNAMSIZ); 

    ifr.ifr_addr.sa_family = AF_INET; 

    if (ioctl(sockfd, SIOCGIFHWADDR, (char*) &ifr) == 0) { 
     sprintf(mac_addr, "%02X:%02X:%02X:%02X:%02X:%02X", 
       (unsigned char) ifr.ifr_ifru.ifru_hwaddr.sa_data[0], (unsigned char) ifr.ifr_ifru.ifru_hwaddr.sa_data[1], 
       (unsigned char) ifr.ifr_ifru.ifru_hwaddr.sa_data[2], (unsigned char) ifr.ifr_ifru.ifru_hwaddr.sa_data[3], 
       (unsigned char) ifr.ifr_ifru.ifru_hwaddr.sa_data[4], (unsigned char) ifr.ifr_ifru.ifru_hwaddr.sa_data[5]); 
     return 0; 
    } 
    } 
    /* error */ 
    return -1; 
} 



int main(int argc, char *argv[], char *envp[]) 
{ 
    char mac_addr[80] = {0}; 
    printf("MAC = %d, %s\n", get_mac_addr(mac_addr), mac_addr); 

    return 0; 
} 
相關問題