読者です 読者をやめる 読者になる 読者になる

プログラマーのメモ書き

伊勢在住のプログラマーが気になることを気ままにメモったブログです

【Android】 macアドレスの取得方法

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)とかは無いのでそれだけを調べていれば見つからない、ということになるのかもしれません。

 

ご参考までに。