我想设计一个应用程序,显示可用的Wi-Fi网络列表,并连接到用户选择的任何网络.
我已经实现了显示扫描结果的部分.现在,我想从扫描结果列表连接到用户选择的特定网络.
我该怎么做呢?
除非他们连接了Wi-Fi,否则我不希望我的用户甚至尝试下载某些内容.但是,我似乎只能判断是否启用了Wi-Fi,但他们仍然可以拥有3G连接.
android.net.wifi.WifiManager m = (WifiManager) getSystemService(WIFI_SERVICE);
android.net.wifi.SupplicantState s = m.getConnectionInfo().getSupplicantState();
NetworkInfo.DetailedState state = WifiInfo.getDetailedStateOf(s);
if (state != NetworkInfo.DetailedState.CONNECTED) {
return false;
}
Run Code Online (Sandbox Code Playgroud)
然而,国家不是我所期望的.即使连接了Wi-Fi,我也会OBTAINING_IPADDR成为状态.
朋友们,我想找到所有可用的WiFi网络并将其显示在我尝试过的列表中,如下所示.但它不起作用.我已经编辑了我的代码,现在我得到了结果但是得到了我不需要的所有结果.我只需要列表中的wifi网络名称.
public class MainActivity extends Activity {
TextView mainText;
WifiManager mainWifi;
WifiReceiver receiverWifi;
List<ScanResult> wifiList;
StringBuilder sb = new StringBuilder();
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
mainText = (TextView) findViewById(R.id.tv1);
mainWifi = (WifiManager) getSystemService(Context.WIFI_SERVICE);
if (mainWifi.isWifiEnabled() == false)
{
// If wifi disabled then enable it
Toast.makeText(getApplicationContext(), "wifi is disabled..making it enabled",
Toast.LENGTH_LONG).show();
mainWifi.setWifiEnabled(true);
}
receiverWifi = new WifiReceiver();
registerReceiver(receiverWifi, new IntentFilter(WifiManager.SCAN_RESULTS_AVAILABLE_ACTION));
mainWifi.startScan();
mainText.setText("Starting Scan...");
}
public boolean onCreateOptionsMenu(Menu menu) {
menu.add(0, 0, 0, "Refresh");
return super.onCreateOptionsMenu(menu);
} …Run Code Online (Sandbox Code Playgroud) 我正在编写一个Android应用程序,它将连接到特定的WPA访问点,连接后,它将发出一个http调用.它不会保存网络配置.我已经阅读了连接到wifi网络上几乎所有关于堆栈溢出的帖子,但找不到对我有用的答案.这是我用来连接的代码..
WifiConfiguration wc = new WifiConfiguration();
wc.allowedAuthAlgorithms.clear();
wc.allowedGroupCiphers.clear();
wc.allowedPairwiseCiphers.clear();
wc.allowedProtocols.clear();
wc.allowedKeyManagement.clear();
wc.SSID = "\"".concat("<ssid>").concat("\"");
wc.preSharedKey = "\"".concat("<password>").concat("\"");
wc.allowedGroupCiphers.set(WifiConfiguration.GroupCipher.TKIP);
wc.allowedGroupCiphers.set(WifiConfiguration.GroupCipher.CCMP);
wc.allowedGroupCiphers.set(WifiConfiguration.GroupCipher.WEP40);
wc.allowedGroupCiphers.set(WifiConfiguration.GroupCipher.WEP104);
wc.allowedKeyManagement.set(WifiConfiguration.KeyMgmt.WPA_PSK);
wc.allowedPairwiseCiphers.set(WifiConfiguration.PairwiseCipher.CCMP);
wc.allowedPairwiseCiphers.set(WifiConfiguration.PairwiseCipher.TKIP);
wc.allowedProtocols.set(WifiConfiguration.Protocol.RSN); // For WPA2
wc.allowedProtocols.set(WifiConfiguration.Protocol.WPA); // For WPA
wc.priority = 0;
//wc.hiddenSSID = true;
wc.status = WifiConfiguration.Status.ENABLED;
// connect to and enable the connection
WifiManager wifiManager = (WifiManager) getSystemService(this.WIFI_SERVICE);
int netId = wifiManager.addNetwork(wc);
boolean wifiEnabled = wifiManager.enableNetwork(netId, true);
wifiManager.setWifiEnabled(true);
Log.d("opener", "addNetwork returned " + netId);
if (netId > 0) {
wifiId = netId;
}
Run Code Online (Sandbox Code Playgroud)
但是netId总是-1.我在两部不同的手机上试过它(ICS:HTC Rezound和GingerBread:摩托罗拉DroidX).两者显示完全相同的结果.我究竟做错了什么? …
从ICS开始,推出了Wi-Fi Direct.通常,我们使用WifiP2pManager该类在Wi-Fi Direct上运行,但似乎它只能在连接后检索GroupOwner IP地址.但是,实际上,任何设备都来协商成为GroupOwner.在Upper Application中,我们需要获取对等方的IP地址或组中每个对等方的IP地址,以便我们可以发送/通信它们.
如何在Wi-Fi Direct中获取每个IP地址?包括自己的IP地址和组中的每个对等体?
通过WifiManager,我的Android应用程序可以获得有关Wi-Fi的大量细节.但是我没有像a/b/g/n那样获得协议类型.我有客户要求这样做.
有谁知道如何实现这一目标?(我没有选择使用adb).它将以编程方式完成.我坚信设备和路由器在连接之前已经协商了协议.所以信息与设备有关.问题是,我们如何得到它?
我想开发一个可以阻止连接到WiFi网络的应用程序,除非我批准它.我希望能够查询接入点的MAC地址,并将其与SSID对应的已知地址列表进行比较.该应用程序的目标是保护用户免于意外连接到恶意访问点,例如可以使用菠萝设备生成的类型.
我不清楚我的研究如何实现这一目标.诸如如何通知wifi网络状态变化等问题?解释如何检测连接已经发生,但对于我的用例已经太晚了.
无论是ConnectivityManager 也WifiManager似乎提供方法补充说,可能会打断正在进行的连接监听器.
我有一些解决方案的想法:
安装自己作为代理,并决定是否允许数据通过.但是,这似乎不是基于Do Android代理设置适用于设备上的所有应用程序的选项吗?(提示:答案是"不").
用我自己创建的东西替换现有的WiFi管理器.但是,我真的很难在Android开发人员指南中找到有关更换系统组件的任何信息.因此,我不确定这在非根电话上是否可行.
将网络密码存储在我的应用程序中,并将WiFi管理器中的密码设置为无意义的值.然后捕获一个广播消息,警告连接失败(可能是类似的东西.我发现菠萝设备可能会接受任何密码,从而使这种方法无效.WifiManager.WPS_AUTH_FAILURE)并有选择地决定重新连接回该网络.可能是一个可能的(如果丑陋的)解决方案,但我可以在网络仍然连接时将密码设置回无意义的值,以确保我们不会安静地连接到另一个同名的SSID吗?我不确定
找到一些方法来阻止Android自动连接到已知网络(即之前使用过的网络或者密码存储在其中).然后我可以管理我的应用程序中的所有连接/断开连接.但是,我无法在手机上看到如何手动执行此操作,因此我怀疑这是可行的.
任何人都可以建议一种可以在非根电话上运行的方法吗?
我有一个必须在离线和在线模式下工作的应用程序.应用程序必须根据当前网络连接(Wifi或数据)的Internet速度向应用服务器发出请求.
如果连接了Wifi,我可以使用此代码获得当前连接的Wifi信号强度.
WifiManager wifiManager = (WifiManager) getApplicationContext().getSystemService(Context.WIFI_SERVICE);
WifiInfo wifiInfo = wifiManager.getConnectionInfo();
int level = WifiManager.calculateSignalLevel(wifiInfo.getRssi(), 5);
Run Code Online (Sandbox Code Playgroud)
要么
wifiInfo.getLinkSpeed();
Run Code Online (Sandbox Code Playgroud)
如果移动互联网已连接,我可以使用监听器类获得信号强度
@Override
public void onSignalStrengthsChanged(SignalStrength signalStrength) {
super.onSignalStrengthsChanged(signalStrength);
int obj = signalStrength.getGsmSignalStrength();
int dBm = (2 * obj) -113;
}
Run Code Online (Sandbox Code Playgroud)
上面的代码获得信号强度,而不是速度.那么,我如何获得连接网络的当前速度?
通常,在商店或网站中找到的速度测试应用程序通过发送或下载特定文件或ping远程服务器然后使用经过的时间计算速度来检查速度.
我正在与之通信的应用服务器不支持此上传/下载或ping功能,因此我无法使用它.
那么,有没有其他方法可以检查当前可以实时完成的互联网连接的速度?
任何线索都可能有所帮助.
PS:此链接具有用于检查当前网络的连接类型的代码.但在某些情况下,我的LTE信号具有完整的强度但没有/非常慢的互联网连接.所以,对我来说,这也不是一个准确的解决方案.
https://gist.github.com/emil2k/5130324
谢谢
我正在使用
public static String getLocalIPAddress(WifiManager wm){
return Formatter.formatIpAddress(wm.getConnectionInfo().getIpAddress());
}
Run Code Online (Sandbox Code Playgroud)
获取执行设备的IP地址.如果设备连接到"公共"wlan网络,并且设备连接到由其他Android设备通过热点托管的wifi网络,则工作正常.如果设备未连接到任何wifi网络,则返回"0.0.0.0"(正确).但是,如果设备通过提供热点来托管wifi网络,则该方法仍然返回"0.0.0.0".如何在"自己的wifi网络"中获取热点提供设备的真实IP地址?
感谢和问候
任何人都可以告诉我如何在Android 6中以编程方式设置静态IP和网关?
Settings.System不再工作了,goolgle说WIFI_STATIC_IP在API级别17中已弃用,WifiManger而是使用.不幸的是我无法找到关于它的任何事情WifiManger和WifiConfiguration类.
android ×10
wifimanager ×10
android-wifi ×9
wifi ×2
ip ×1
java ×1
networking ×1
security ×1
wifi-direct ×1