Android端末のMACアドレスを調べる必要があったので、ちょっと調べてみました。やり方をメモっときます。
基本的に、stackoverflow の How to get IP address of the device? に載ってる方法です。
MacAddress取得クラス
package com.example.macaddresstest; import java.net.NetworkInterface; import java.util.Collections; import java.util.HashMap; import java.util.List; import java.util.Map; import java.util.Map.Entry; import android.util.Log; /** * Macアドレス取得クラス * @see http://stackoverflow.com/questions/6064510/how-to-get-ip-address-of-the-device/13007325#13007325 * @author mor * */ public class MacAddress { private static final String TAG = MacAddress.class.getSimpleName(); private static StringBuilder mStringBuilder = new StringBuilder(); public static String getMacAddressString() { Map<String, String> macs = getMacAddress(); mStringBuilder.setLength(0); for (Entry<String, String> e : macs.entrySet()) { mStringBuilder.append("intf name:" + e.getKey()); mStringBuilder.append(", mac:" + e.getValue()); mStringBuilder.append("\n"); } return mStringBuilder.toString(); } public static Map<String, String> getMacAddress() { HashMap<String, String> macs = new HashMap<String, String>(); try { List<NetworkInterface> interfaces = Collections.list(NetworkInterface.getNetworkInterfaces()); Log.d(TAG,"intf num:" + interfaces.size()); for (NetworkInterface intf : interfaces) { String name = intf.getName(); if (null != name) { byte[] raw = intf.getHardwareAddress(); if (null != raw) { String mac = getMacString(raw); macs.put(name, mac); Log.d(TAG,"intf name:" + name + ", mac:" + mac); } else { macs.put(name, null); Log.d(TAG,"intf name:" + name + ", mac: null"); } } } } catch(Exception e) { Log.d(TAG, "exception occured:", e); return null; } return macs; } private static String getMacString(byte[] raw) { mStringBuilder.setLength(0); for (int i = 0; i < raw.length; i++) { mStringBuilder.append(String.format("%02x", raw[i])); } return mStringBuilder.toString(); } }
このクラスを使うアプリ側では、AndroidManifest.xml に次のパーミッションを追加しておきます。
<uses-permission android:name="android.permission.INTERNET" /> <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
また、minSdkVersion は9(2.3)以上を指定しておきます。
これを使うにはActivityから、
package com.example.macaddresstest; import android.os.Bundle; import android.app.Activity; import android.view.Menu; import android.widget.TextView; public class MainActivity extends Activity { @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); String info = MacAddress.getMacAddressString(); TextView tv = (TextView) findViewById(R.id.main_text); tv.setText(info); } @Override public boolean onCreateOptionsMenu(Menu menu) { // Inflate the menu; this adds items to the action bar if it is present. getMenuInflater().inflate(R.menu.main, menu); return true; } }
のように呼んでやればOKです。
手元の実機(Galaxy Nexus)、エミュレータとも、複数のインターフェースについて、インターフェース名とMacアドレス(ハードウェアアドレス)が表示されました。
なお、エミュレータはインターフェース名が、wlan0ではなく、eth0になっていました。
ネットで検索していたときに、エミュレータはMacアドレスが取れない、とか書いてあるのを見かけましたが、無線LANインターフェース(wlan0)とかは無いのでそれだけを調べていれば見つからない、ということになるのかもしれません。
ご参考までに。