Если вы все еще ищете ответ, вот как:
- Определите имя собственного устройства
Это становится доступным после получения намерения WIFI_P2P_THIS_DEVICE_CHANGED_ACTION
в вашемприемник вещания.Просто используйте переменную-член deviceName
следующим образом:
@Override
public void onReceive(Context context, Intent intent) {
String action = intent.getAction();
if(WifiP2pManager.WIFI_P2P_THIS_DEVICE_CHANGED_ACTION.equals(action)) {
WifiP2pDevice self = (WifiP2pDevice) intent.getParcelableExtra(WifiP2pManager.EXTRA_WIFI_P2P_DEVICE);
// Now self.deviceName gives you own device name
} else if(WifiP2pManager.WIFI_P2P...) {
...
2. Измените имя собственного устройства
Нет способа изменить имя устройства с помощью WifiP2pManager
согласнодокументы разработчика, и хотя в исходном коде существует общедоступный метод setDeviceName()
, вы не можете вызывать его для своего объекта (возможно, чтобы разработчики не вызывали его для объекта, представляющего соседнее одноранговое устройство).Для меня было полезно получить объект Method
, представляющий указанный метод, и вызвать его на моем экземпляре WifiP2pManager
:
private WifiP2pManager manager;
private WifiP2pManager.Channel channel;
...
public void changeDeviceName(String deviceNewName) {
try {
Method method = manager.getClass().getMethod("setDeviceName", WifiP2pManager.Channel.class, String.class, WifiP2pManager.ActionListener.class);
method.invoke(manager, channel, deviceNewName, new WifiP2pManager.ActionListener() {
@Override
public void onSuccess() {
Toast.makeText(MainActivity.this, "Name successfully changed", Toast.LENGTH_LONG).show();
}
@Override
public void onFailure(int reason) {
Toast.makeText(MainActivity.this, "Request failed: " + reason, Toast.LENGTH_SHORT).show();
Log.d(TAG, "Name change failed: " + reason);
}
});
} catch (Exception e) {
e.printStackTrace();
}
}
В качестве альтернативы, пользователи могут переименовать свое устройство вручную из расширенных настроек Wi-Fi (Настройки>Дополнительно> WiFi Direct> Настроить устройство),
РЕДАКТИРОВАТЬ: Начиная с Pie, использование не-SDK интерфейсов (по существу, классов, переменных или методов, помеченных @hide, к которым вы обращаетесь с помощью отражения), ограничено и будетв конечном итоге будет запрещено.Вышеупомянутый метод в настоящее время является серым списком (что означает, что поддержка для отражения этого может быть удалена в будущем).Подробнее читайте здесь: https://developer.android.com/distribute/best-practices/develop/restrictions-non-sdk-interfaces