我想创建一个像shareit这样的文件共享应用,但我真的很困惑共享如何发现附近的设备。
当您单击“接收”按钮时,shareit会在接收方创建热点,而发送方无需连接到热点即可显示接收方名称。怎么可能?
如果shareit使用Wi-Fi直接,那么创建热点的重点是什么?
要使用网络服务发现(NSD)服务器和客户端应该在同一个网络上,所以我认为shareit正在使用其他东西
如果有人能解释这种共享概念,那将非常有帮助。
答案 0 :(得分:2)
我终于找到了答案! SHAREit使用WiFi SSID识别附近的应用用户。 SSID由两部分组成。 BAHD-bXViYQ在哪里' B'代表ANDROID DEVICE和用户图标的AHD。第二部分是在Base64中编码的用户名。在这个例子中我的名字是muba。 我希望这个答案有助于节省时间。
答案 1 :(得分:0)
你看过:this 我没有亲自使用它,但是给定的描述,它可能提供你正在寻找的东西......
答案 2 :(得分:0)
好吧,我发现了如何从一个共享应用程序启用hotspot
并找到该共享应用程序启用的可用wifi列表。就像shareIt receiver
启用wifi热点和sender discovers
可用receivers
的列表一样。
首先,您必须使用WifiManager
public void startScan(){
mWifiManager.startScan();
mScanResultList = mWifiManager.getScanResults();
mWifiConfigurations = mWifiManager.getConfiguredNetworks();
}
现在将此mScanResultList
传递给可根据您的要求查找网络的方法。
public static List<ScanResult> filterWithNoPassword(List<ScanResult> scanResultList){
if(scanResultList == null || scanResultList.size() == 0){
return scanResultList;
}
List<ScanResult> resultList = new ArrayList<>();
for(ScanResult scanResult : scanResultList){
if(scanResult.capabilities != null && scanResult.capabilities.equals(NO_PASSWORD) || scanResult.capabilities != null && scanResult.capabilities.equals(NO_PASSWORD_WPS)){
resultList.add(scanResult);
}
}
return resultList;
}
现在将resultList
传递到arraylist适配器以在列表中显示网络。在适配器的convertView
方法内部,只需将该dataList传递给扫描仪即可获取网络的ssid和mac地址
@Override
public View convertView(int position, View convertView) {
ScanResultHolder viewHolder = null;
if(convertView == null){
convertView = View.inflate(getContext(), R.layout.item_wifi_scan_result, null);
viewHolder = new ScanResultHolder();
viewHolder.iv_device = (ImageView) convertView.findViewById(R.id.iv_device);
viewHolder.tv_name = (TextView) convertView.findViewById(R.id.tv_name);
viewHolder.tv_mac = (TextView) convertView.findViewById(R.id.tv_mac);
convertView.setTag(viewHolder);
}else{
viewHolder = (ScanResultHolder) convertView.getTag();
}
ScanResult scanResult = getDataList().get(position);
if(scanResult != null){
viewHolder.tv_name.setText(scanResult.SSID);
viewHolder.tv_mac.setText(scanResult.BSSID);
}
return convertView;
}
这是启用hotspot
public static boolean configApState(Context context, String apName) {
WifiManager wifimanager = (WifiManager) context.getSystemService(context.WIFI_SERVICE);
WifiConfiguration wificonfiguration = null;
try {
wificonfiguration = new WifiConfiguration();
wificonfiguration.SSID = apName;
// if WiFi is on, turn it off
if(isApOn(context)) {
wifimanager.setWifiEnabled(false);
// if ap is on and then disable ap
disableAp(context);
}
Method method = wifimanager.getClass().getMethod("setWifiApEnabled", WifiConfiguration.class, boolean.class);
method.invoke(wifimanager, wificonfiguration, !isApOn(context));
return true;
}
catch (Exception e) {
e.printStackTrace();
}
return false;
}