2012-08-01 24 views
1

我試圖讓我的Android設備的MAC地址,而不依賴於myWifiInfo.getMacAddress()獲取android系統中的MAC地址,而不使用WifiInfo例如

以下是我使用的代碼:

 try{ 
      InetAddress inet = InetAddress.getLocalHost(); 
      NetworkInterface ni = NetworkInterface.getByInetAddress(inet); 
      byte[] address = ni.getHardwareAddress(); 
      } 
     catch(Exception e){ 
      Log.d("MyActivity",e.toString()); 
     } 

我得到以下例外:

08-01 06:10:56.239: WARN/System.err(23164): at java.net.NetworkInterface.rethrowAsSocketException(NetworkInterface.java:212) 
08-01 06:10:56.239: WARN/System.err(23164): at java.net.NetworkInterface.collectIpv4Address(NetworkInterface.java:178) 
08-01 06:10:56.239: WARN/System.err(23164): at java.net.NetworkInterface.getByName(NetworkInterface.java:118) 
08-01 06:10:56.239: WARN/System.err(23164): at java.net.NetworkInterface.getNetworkInterfacesList(NetworkInterface.java:270) 
08-01 06:10:56.239: WARN/System.err(23164): at java.net.NetworkInterface.getByInetAddress(NetworkInterface.java:228) 
08-01 06:10:56.239: WARN/System.err(23164): at com.example.MyActivity$MyAsyncTask.doInBackground(MyActivity.java:82) 
08-01 06:10:56.247: WARN/System.err(23164): at com.example.MyActivity$MyAsyncTask.doInBackground(MyActivity.java:43) 
08-01 06:10:56.247: WARN/System.err(23164): at android.os.AsyncTask$2.call(AsyncTask.java:264) 
08-01 06:10:56.247: WARN/System.err(23164): at java.util.concurrent.FutureTask$Sync.innerRun(FutureTask.java:305) 
08-01 06:10:56.247: WARN/System.err(23164): at java.util.concurrent.FutureTask.run(FutureTask.java:137) 
08-01 06:10:56.247: WARN/System.err(23164): at android.os.AsyncTask$SerialExecutor$1.run(AsyncTask.java:208) 
08-01 06:10:56.247: WARN/System.err(23164): at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1076) 
08-01 06:10:56.247: WARN/System.err(23164): at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:569) 
08-01 06:10:56.247: WARN/System.err(23164): at java.lang.Thread.run(Thread.java:856) 
08-01 06:10:56.247: WARN/System.err(23164): Caused by: libcore.io.ErrnoException: socket failed: EACCES (Permission denied) 
08-01 06:10:56.247: WARN/System.err(23164): at libcore.io.Posix.socket(Native Method) 
08-01 06:10:56.247: WARN/System.err(23164): at libcore.io.BlockGuardOs.socket(BlockGuardOs.java:181) 
08-01 06:10:56.247: WARN/System.err(23164): at java.net.NetworkInterface.collectIpv4Address(NetworkInterface.java:163)      
08-01 06:10:56.247: WARN/System.err(23164): ... 12 more 

我已經給許可

<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" /> 

的異常是從下面一行在上面的代碼拋出:

NetworkInterface ni = NetworkInterface.getByInetAddress(inet); 

當我登錄的INET地址,我得到了相同localhost/127.0.0.1

有人能請指出這樣做的原因問題和解決方案相同?

任何幫助深表感謝

+0

你也可以使用藍牙API獲取MAC地址 – Lucifer 2012-08-01 06:41:16

+0

感謝信息。但我試圖瞭解我解釋的問題的原因,並解釋相同 – user1400538 2012-08-01 06:44:29

+0

只是一個猜測嘗試給你的代碼中的'<使用權限android:name =「android.permission.INTERNET」/>'權限。 – Lucifer 2012-08-01 06:47:36

回答

1

您也可以嘗試以下藍牙API代碼來獲取MAC地址,

private BluetoothAdapter btAdapther; 

mBtAdapter = BluetoothAdapter.getDefaultAdapter(); 
String deviceMacAddress = mBtAdapter.getAddress(); 

權限在AndroidManifest.xml

<uses-permission android:name="android.permission.BLUETOOTH_ADMIN" /> 
<uses-permission android:name="android.permission.BLUETOOTH" /> 
+2

這不是檢索藍牙接收器的mac地址,而是無線的? – Thys 2012-08-01 06:49:45

+0

@MrThys它檢索設備的MAC地址,它是相同的。 – Lucifer 2012-08-01 07:19:36

+0

我不這麼認爲,當我檢查我的手機(HTC One X)上的硬件信息(在設置中)時,有WiFi和藍牙的MAC地址,它們不一樣 – Thys 2012-08-01 08:42:36

0

您可以閱讀/sys/class/net/eth0/address作爲文本文件,並且此文件包含接口的ethernet-MAC-addresseth0接口,如果您的設備具有以太網硬件。

示例代碼可以幫助你:

public String getMac() 
{ 
    StringBuffer fileData = new StringBuffer(1000); 
    try { 
     BufferedReader reader = new BufferedReader(new FileReader("/sys/class/net/eth0/address")); 
     char[] buf = new char[1024]; 
     int numRead = 0; 
     while ((numRead = reader.read(buf)) != -1) { 
      String readData = String.valueOf(buf, 0, numRead); 
      fileData.append(readData); 
     } 
     reader.close(); 
     return fileData.toString(); 
    } catch (FileNotFoundException e) { 
     e.printStackTrace(); 
    } catch (IOException e) { 
     e.printStackTrace(); 
    } 
    return null; 
} 
+0

必須啓用Wifi才能使其工作,如果關閉則該文件丟失。 – marcinj 2012-09-17 12:35:03

+0

我在只有以太網端口可用的設備中使用了相同的一段代碼。此外,相同的代碼在帶有wifi +以太網的設備上工作正常(並且wifi已關閉)。所以我相信文件閱讀不依賴於無線網絡開/關狀態 – sunil 2012-09-17 16:20:35

+0

我現在正在使用只有wifi和BT可用的設備(android 2.3.4),並且我在DDMS中看到此文件正在消失並出現一旦wifi被打開/關閉。我也在java代碼中體驗過這一點。 – marcinj 2012-09-17 16:30:14

0
public String getMacAddressFromEtcFile(){ 
     try { 
      return loadFileAsString("/sys/class/net/eth0/address").toUpperCase().substring(0, 17); 
     } catch (IOException e) { 
      e.printStackTrace(); 
      return null; 
     } 
    } 


public static String loadFileAsString(String filePath) throws java.io.IOException{ 
     StringBuffer fileData = new StringBuffer(1000); 
     BufferedReader reader = new BufferedReader(new FileReader(filePath)); 
     char[] buf = new char[1024]; 
     int numRead = 0; 
     while((numRead = reader.read(buf)) != -1){ 
      String readData = String.valueOf(buf, 0, numRead); 
      fileData.append(readData); 
     } 
     reader.close(); 
     return fileData.toString(); 
    } 
相關問題