Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/vba/17.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Android 如何检索WiFi Direct MAC地址?_Android_Wifi Direct - Fatal编程技术网

Android 如何检索WiFi Direct MAC地址?

Android 如何检索WiFi Direct MAC地址?,android,wifi-direct,Android,Wifi Direct,我正在尝试检索Android设备的MAC地址。如果WiFi已打开,则通常可以通过WiFiManager API执行此操作 如果WiFi关闭且WiFi Direct打开,是否有办法获取MAC地址? 在我的手机上,WiFi和WiFi Direct不能同时打开 谢谢WiFi的mac地址与WiFi Direct的mac地址不同。通常前两个字母可能不同。注意这一点。WiFi Direct mac地址将有所不同。这里的@auselen很好地解释了这一点 我刚刚想出了一个方法来检索WiFi Direct ma

我正在尝试检索Android设备的MAC地址。如果WiFi已打开,则通常可以通过WiFiManager API执行此操作

如果WiFi关闭且WiFi Direct打开,是否有办法获取MAC地址? 在我的手机上,WiFi和WiFi Direct不能同时打开


谢谢

WiFi的mac地址与WiFi Direct的mac地址不同。通常前两个字母可能不同。注意这一点。

WiFi Direct mac地址将有所不同。这里的@auselen很好地解释了这一点

我刚刚想出了一个方法来检索WiFi Direct mac地址。这并不漂亮,但却完成了任务。这是密码

    final WifiP2pManager p2pManager = (WifiP2pManager) getSystemService(WIFI_P2P_SERVICE);
    final WifiP2pManager.Channel channel = p2pManager.initialize(this, getMainLooper(), null);

    p2pManager.createGroup(channel, new WifiP2pManager.ActionListener() {
        @Override
        public void onSuccess() {
            p2pManager.requestGroupInfo(channel, new WifiP2pManager.GroupInfoListener() {
                @Override
                public void onGroupInfoAvailable(WifiP2pGroup wifiP2pGroup) {
                    Log.i("", wifiP2pGroup.getOwner().deviceAddress);

                    // Following removal necessary to not have the manager busy for other stuff, subsequently
                    p2pManager.removeGroup(channel, new WifiP2pManager.ActionListener() {
                        @Override
                        public void onSuccess() {
                            Log.i("", "Removed");
                        }

                        @Override
                        public void onFailure(int i) {
                            Log.i("", "Failed " + i);
                        }
                    });
                }
            });
        }

        @Override
        public void onFailure(int i) {
            Log.i("", String.valueOf(i));
        }
    });

在我的项目中,我一直在寻找这个。我的要求是在由WiFi Direct组成的临时P2p网络中唯一地识别设备。每台设备都应该在下次接近时识别其朋友设备。我需要我自己的WiFi(Direct)MAC和我的朋友为创建好友区创建密钥

我的研究:该设计有一个唯一的通用ID和一个本地ID。原因:通用ID只能用于连接基础设施模式的网络。本地ID可用于“特殊”模式网络(设备到设备)。在这种特殊模式下,单个设备可能同时属于多个特殊组

  • 因此,为了支持这种并发操作,P2p设备支持 多个MAC实体,可能位于不同的通道上
  • 对于每个会话,持久组可以使用不同的通道和设备 每个会话的MAC
  • P2P设备在发现和协商期间使用其全局MAC地址作为设备ID,并使用组内所有帧的临时本地MAC地址 然而,要获得自己的WiFi P2p MAC地址,没有直接的方法

    在这个问题的讨论中,来自谷歌的项目成员建议这是可能的,只是它还没有被记录下来

    解决方案:使用意向过滤器
    WifiP2pManager.WIFI\u P2P\u此设备\u更改了\u操作
    和额外的 从intent
    WifiP2pManager.EXTRA\u WIFI\u P2P\u设备

    以下是我在项目中使用它的方式:

    @Override
    public void onReceive(Context context, Intent intent) {
    ....
    ....
    String action = intent.getAction();
    
    if (WifiP2pManager.WIFI_P2P_THIS_DEVICE_CHANGED_ACTION
                .equals(action)) {
    
            WifiP2pDevice device = (WifiP2pDevice) intent
                    .getParcelableExtra(WifiP2pManager.EXTRA_WIFI_P2P_DEVICE);
    
            String myMac = device.deviceAddress;
    
            Log.d(TAG, "Device WiFi P2p MAC Address: " + myMac);
    
    /* Saving WiFi P2p MAC in SharedPref */
    
            sharedPref = context.getSharedPreferences(context.getString(R.string.sp_file_name), Context.MODE_PRIVATE);
            String MY_MAC_ADDRESS = sharedPref.getString(context.getString(R.string.sp_field_my_mac), null);
    
            if (MY_MAC_ADDRESS == null || MY_MAC_ADDRESS != myMac) {
                SharedPreferences.Editor editor = sharedPref.edit();
                editor.putString(context.getString(R.string.sp_field_my_mac), myMac);
                editor.commit();
            }
    

    希望这对别人有帮助

    WiFi的mac地址与WiFi Direct的mac地址不同

    您可以使用下一个代码获取WiFi直达地址:

        public String getWFDMacAddress(){
        try {
            List<NetworkInterface> interfaces = Collections.list(NetworkInterface.getNetworkInterfaces());
            for (NetworkInterface ntwInterface : interfaces) {
    
                if (ntwInterface.getName().equalsIgnoreCase("p2p0")) {
                    byte[] byteMac = ntwInterface.getHardwareAddress();
                    if (byteMac==null){
                        return null;
                    }
                    StringBuilder strBuilder = new StringBuilder();
                    for (int i=0; i<byteMac.length; i++) {
                        strBuilder.append(String.format("%02X:", byteMac[i]));
                    }
    
                    if (strBuilder.length()>0){
                        strBuilder.deleteCharAt(strBuilder.length()-1);
                    }
    
                    return strBuilder.toString();
                }
    
            }
        } catch (Exception e) {
            Log.d(TAG, e.getMessage());
        }
        return null;
    }
    
    公共字符串getWFDMacAddress(){
    试一试{
    List interfaces=Collections.List(NetworkInterface.getNetworkInterfaces());
    用于(网络接口ntwInterface:接口){
    if(ntwInterface.getName().equalsIgnoreCase(“p2p0”)){
    字节[]byteMac=ntwInterface.getHardwareAddress();
    if(byteMac==null){
    返回null;
    }
    StringBuilder strBuilder=新StringBuilder();
    对于(int i=0;i0){
    strBuilder.deleteCharAt(strBuilder.length()-1);
    }
    返回strBuilder.toString();
    }
    }
    }捕获(例外e){
    Log.d(标记,例如getMessage());
    }
    返回null;
    }