Настройка Android Wi-Fi P2P локальный сервис без возможности подключения - PullRequest
0 голосов
/ 28 марта 2019

Я хотел бы настроить локальную службу Android Wi-Fi P2P с некоторыми записями DNS, и я уже сделал это.Моему приложению нужны только эти записи, и нет необходимости устанавливать связь между пирами.Но я столкнулся с проблемой: сервис виден другим пользователям Android, и они могут попытаться подключиться к сервису моего приложения.Пользователь моего приложения увидит диалог принятия: "Принять запрос на обмен?"и это довольно раздражает.Есть ли какой-нибудь способ сделать мой сервис недоступным или прервать соединения, прежде чем показывать диалоговое окно подтверждения или выполнить аутентификацию по паролю, как в точке доступа Wi-Fi?Спасибо.

private WifiP2pManager manager;
private WifiP2pManager.Channel channel;
private WifiP2pDnsSdServiceInfo serviceInfo;
private final int PERIOD = 5000;
private String Tag = "WifiP2PService";
String SERVICE_INSTANCE = "P2p_Service";
private WifiP2pDnsSdServiceRequest serviceRequest;

public WifiP2PService(Context ctx){
    manager = (WifiP2pManager) ctx.getSystemService(Context.WIFI_P2P_SERVICE);
    channel = manager.initialize(ctx, ctx.getMainLooper(), null);
    serviceRequest = WifiP2pDnsSdServiceRequest.newInstance();
    Map record = new HashMap();
    record.put("user_id", ""+(int)(Math.random() * 1000));
    serviceInfo = WifiP2pDnsSdServiceInfo.newInstance(SERVICE_INSTANCE, "_http._tcp", record);
    manager.setDnsSdResponseListeners(channel, null, new WifiP2pManager.DnsSdTxtRecordListener() {
        @Override
        public void onDnsSdTxtRecordAvailable(String fullDomainName, Map<String, String> txtRecordMap, WifiP2pDevice srcDevice) {
            Log.i(Tag, "Finded: "+txtRecordMap.get("user_id"));
        }
    });
}

public void startBroadcastingService(){
    manager.clearLocalServices(channel, new WifiP2pManager.ActionListener() {
        @Override
        public void onSuccess() {
            manager.addLocalService(channel, serviceInfo,
                    new WifiP2pManager.ActionListener() {
                        @Override
                        public void onSuccess() {
                            Log.i(Tag, "Started");
                            setWifiDirectName("WifiP2p Android");
                        }

                        @Override
                        public void onFailure(int error) {
                            Log.i(Tag, "Failed to start");
                        }
                    });
        }

        @Override
        public void onFailure(int error) {
            Log.i(Tag, "Failed to clean");
        }
    });
}

public void startSearching() {
    manager.removeServiceRequest(
            channel,
            serviceRequest,
            new WifiP2pManager.ActionListener() {
                @Override
                public void onSuccess() {
                    manager.addServiceRequest(channel, serviceRequest, new WifiP2pManager.ActionListener() {
                                @Override
                                public void onSuccess() {
                                    manager.discoverServices(channel, new WifiP2pManager.ActionListener() {
                                        @Override
                                        public void onSuccess() {

                                        }
                                        @Override
                                        public void onFailure(final int error) {
                                        }
                                    });
                                }
                                @Override
                                public void onFailure(final int reason) {
                                }
                            }
                    );
                }
                @Override
                public void onFailure(final int reason) {
                }
            }
    );
}

public void setWifiDirectName(final String deviceName) {
    try {
        final Class[] paramTypes = new Class[3];
        paramTypes[0] = WifiP2pManager.Channel.class;
        paramTypes[1] = String.class;
        paramTypes[2] = WifiP2pManager.ActionListener.class;
        final Method setDeviceName = manager.getClass().getMethod(
                "setDeviceName", paramTypes);
        setDeviceName.setAccessible(true);

        final Object[] arglist = new Object[3];
        arglist[0] = channel;
        arglist[1] = deviceName;
        setDeviceName.invoke(manager, arglist);
    } catch (final Exception e) {
        e.printStackTrace();
    }
}

public void stopLocalService() {
    Log.i(Tag, "Stopped");
    manager.clearLocalServices(channel, null);
    manager.removeServiceRequest(channel, serviceRequest, null);
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...