如何在WiFi直连P2P中更改设备名称?

10

通过代码更改WiFi直连设备名称是否可行?我已经尝试了:

private WifiP2pDevice wDevice;
wDevice.deviceName = "newName";

但是,显然它不起作用。有什么想法?!


这个问题是否类似于以下链接?https://dev59.com/0oXca4cB1Zd3GeqPNcvR也就是说,您想要更改正在广播的设备名称吗? - Ebrahim Karam
3个回答

10

以下代码使用Java的反射API,由于效率不高,因此它不是首选方案,但Android没有提供其他方法,所以您可以使用它,运行得很好:

    try {
        Method m = wpm.getClass().getMethod(
                "setDeviceName",
                new Class[] { WifiP2pManager.Channel.class, String.class,
                        WifiP2pManager.ActionListener.class });

        m.invoke(WifiP2pManager wifimngr,WifiP2pManager.Channel wifichannel, new_name, new WifiP2pManager.ActionListener() {
            public void onSuccess() {
                //Code for Success in changing name
            }

            public void onFailure(int reason) {
                //Code to be done while name change Fails
            }
        });
    } catch (Exception e) {

        e.printStackTrace();
    }

你能否详细解释一下为什么这段代码会有帮助,以及它的作用是什么?谢谢。 - StackExchange What The Heck
你能否回答这个问题 https://stackoverflow.com/q/53607516/9640177 - 如何获取当前设备名称 - Mayank Kumar Chaudhari

9
这段代码对我有效。
WifiP2pManager manager;
WifiP2pManager.Channel channel;
    try {
       manager = (WifiP2pManager)getSystemService(Context.WIFI_P2P_SERVICE);
        channel = manager.initialize(this, getMainLooper(), new WifiP2pManager.ChannelListener() {
            @Override
            public void onChannelDisconnected() {
                manager = (WifiP2pManager) getSystemService(Context.WIFI_P2P_SERVICE);
            }
        });
        Class[] paramTypes = new Class[3];
        paramTypes[0] = WifiP2pManager.Channel.class;
        paramTypes[1] = String.class;
        paramTypes[2] = WifiP2pManager.ActionListener.class;
        Method setDeviceName = manager.getClass().getMethod(
                "setDeviceName", paramTypes);
        setDeviceName.setAccessible(true);

        Object arglist[] = new Object[3];
        arglist[0] = channel;
        arglist[1] = devName;
        arglist[2] = new WifiP2pManager.ActionListener() {

            @Override
            public void onSuccess() {
                Log.d("setDeviceName succeeded", "true");
            }

            @Override
            public void onFailure(int reason) {
                Log.d("setDeviceName failed", "true");
            }
        };
        setDeviceName.invoke(manager, arglist);

    } catch (NoSuchMethodException e) {
        e.printStackTrace();
    } catch (IllegalAccessException e) {
        e.printStackTrace();
    } catch (IllegalArgumentException e) {
        e.printStackTrace();
    } catch (InvocationTargetException e) {
        e.printStackTrace();
    }

今天在Android 6.0.1上测试了它 - 运行得很好。谢谢。 - RoundSparrow hilltx
它可以正常工作吗?安全方面是否存在风险?使用WifiP2pManager.WIFI_P2P_THIS_DEVICE_CHANGED_ACTION进行意图广播怎么样? - user3290180
今天也在6.0上测试过了,完美运行!非常感谢。 - Mirjalal
这在最新的安卓版本上还能用吗? - HasIEluS

0

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接