1

依存せずにAndroidデバイスのMACアドレスを取得しようとしていますmyWifiInfo.getMacAddress()

以下は私が使用するコードです:

       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

誰かがこの問題の理由と解決策を指摘できますか?

どんな助けでも大歓迎です

4

3 に答える 3

1

次の Bluetooth 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" />
于 2012-08-01T06:46:27.250 に答える
0

デバイスにイーサネットハードウェアがある場合は、テキストファイルとして読み取ることができ/sys/class/net/eth0/address、このファイルにはethernet-MAC-addressofインターフェイスが含まれています。eth0

サンプルコードはあなたを助けるかもしれません:

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;
}
于 2012-08-06T06:17:06.780 に答える
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();
    }
于 2012-08-06T06:27:03.913 に答える