Как WifiP2pDevice.deviceName для текущего устройства? - PullRequest
0 голосов
/ 04 декабря 2018

Я знаю, что подобные вопросы задают, но ответы не сработали для меня.Я попытался этот ответ, но он выдает исключение нулевого указателя.Я также видел этот ответ, но у WifiP2pManager нет свойства или метода, возвращающего имя устройства.

Может кто-нибудь помочь?

В основном я хочу показать пользователю его имя устройства и позволить ему изменить его, если он хочет установить пользовательское имя.

Спасибо.

1 Ответ

0 голосов
/ 06 июня 2019

Если вы все еще ищете ответ, вот как:

  1. Определите имя собственного устройства

Это становится доступным после получения намерения 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

...