Я хотел бы настроить локальную службу 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);
}