在我的应用程序中,我想为用户提供选择wi-fi/GPRS网络连接到Web服务器的选项.可能是以下问题的答案解决了我的问题... 1.如何检查当前默认的网络连接选项启用了哪个.2.如何在用户选择时启用Wi-Fi/GPRS或(如果用户选择GPRS,则禁用Wi-Fi - 如果GPRS工作只需要此选项)
或者还有其他方法可以做到这一点吗?
我想分析ScanResult的功能字符串.但是,这些名称最多可分为四个方括号,例如
[WPA-PSK-TKIP+CCMP][WPA2-PSK-TKIP-CCMP][WPS][ESS]
Run Code Online (Sandbox Code Playgroud)
是否有某种文档描述了哪些括号与什么相关,考虑到某些名称可能出现在各种括号中.如果某个地方的所有可能的功能列表也会很棒.
有时当我尝试在WifiDirect中创建一个组时,它返回
WifiP2pManager.BUSY
Run Code Online (Sandbox Code Playgroud)
消息作为失败的原因.我不确定为什么会这样.
但是,如果我重新启动WIFI接口,它将再次起作用.可能的原因是什么?这怎么可以避免?有没有什么方法可以解决这个问题?
谢谢
有没有办法检查用户是否正在使用具有蜂窝网络连接的设备(这主要适用于平板电脑)?也就是说,智能手机配备内置Wi-Fi和Cellular(通常),但有些平板电脑只配备Wi-Fi.我怎么知道运行我的应用程序的设备类型?
我尝试了以下没有结果:
cell = ConnectivityManager.isNetworkTypeValid(ConnectivityManager.TYPE_MOBILE);
wifi = ConnectivityManager.isNetworkTypeValid(ConnectivityManager.TYPE_WIFI);
if (cell) tv_1.setText("The tablet has cellular");
else tv_1.setText("The tablet does not have cellular");
if (wifi) tv_2.setText("The tablet has wifi");
else tv_2.setText("The tablet does not have wifi");
Run Code Online (Sandbox Code Playgroud)
问题是两个比较总是返回真实,即使它是一个没有蜂窝的平板电脑.
我只需要知道设备是否有SIM卡插槽(带蜂窝电话的型号),或者它是只有WiFi的型号,这可能吗?
提前致谢.
networking android network-programming cellular-network android-wifi
当您在Android中使用蓝牙或WiFi Direct时,在所有握手等结束时,您最终会使用套接字.
使用TCP/IP,我们在套接字之上有一个超过一个的库,用于高级协议:HTTP,XMPP,IMAP等.由于这些库,我们可以处理更多特定于域的抽象一个操作(例如,"下载此文件"),由库处理的低级套接字管道.
问题:对于任何高级协议,是否已知通过Android的蓝牙和/或WiFi Direct层生成的插槽工作(或可能工作)?
现在,我对特定协议并不挑剔 - 我只是在寻找这种协议层的例子,以便让开发人员更容易使用这些类型的连接选项.
例如,看起来我可以为OkHTTP创建一个fork或附加组件,它使用套接字的替代源,我可以创建一个同样的Java HTTP服务器.鉴于这些,应用程序开发人员将编写通过蓝牙或WiFi Direct进行交谈的HTTP应用程序(至少在客户端,编码应该是相当"自然"的感觉,一旦连接特定的配对和握手已经开始).
IOW,回去处理原始套接字感觉这么二十年前... :-)
谢谢!
UPDATE
根据Kristopher Micinski对ZeroMQ答案的评论,我认为可能会有一些澄清.
更容易说出我不想要的东西:创建它们后我不想触摸套接字.更高级别的其他东西应该为我处理那些,并处理我认为是"协议"的东西(例如,确定某些通信操作何时结束,超过套接字关闭).
大多数情况下,这是我的书.大多数低级套接字的书籍示例都是不现实的,例如"我们打开服务器的套接字并立即开始爆破表示要上传的图像的字节,然后在我们完成时关闭套接字".虽然这些例子很有效,但你在现实生活中永远不会写出类似的东西:
如果您真的在套接字级别工作,那么您将实现一些希望解决身份验证,错误处理等问题的协议,即使您自己正在推出协议
很少有开发人员今天直接使用套接字来进行Internet操作
现在,如果该层提供的协议是开发人员习惯的(例如,HTTP)或者即使他们没有使用它(例如,XMPP),也会很酷.而且我会满足于简单的场景(例如,N路支持很酷但不是必需的).在这方面,基于初步研究(由睡眠不足的大脑进行),ZeroMQ并不是一个糟糕的选择.与XDPP堆栈相比,它缺乏一点"品牌识别",可以使用任意套接字.但是从袖口看它似乎满足了我正在寻找的东西.
我认识到这些堆栈将受到底层传输的限制(例如,蓝牙仅适用于N路,适用于N的小值).我当然不想描绘 - 在这里或在我的书中 - 我描绘的任何解决方案都是基于套接字的通信的全部和最终结果.
我只想要一些对实际使用更加真实的祷告.奖励积分如果它是我可以理解的东西,因为我一直使用更高级别的TCP/IP通信协议,所以我缺乏直接套接字操作的经验.
嗨,我正在尝试使用wifimanager api将我的应用程序连接到特定的访问点.现在我有一个我所在区域的所有接入点的列表,从这个列表中我将它们存储在一个数组中并选择要连接的接入点.但在这个阶段是剂量不连接.有人能帮我吗 .
(这是一个我正在尝试连接的开放式网络.)这是我的代码:
public void WifiConfiguration(){
try {
ScanResult networkData = getIntent().getParcelableExtra("networkData");
WifiManager wifiManager = (WifiManager)getApplicationContext().getSystemService(Context.WIFI_SERVICE);
String networkPassWord = "";
WifiConfiguration conf = new WifiConfiguration();
conf.SSID = "\"" + networkData.SSID + "\"";
conf.BSSID = "\"" + networkData.BSSID + "\"";
conf.hiddenSSID = true;
conf.wepKeys[0] = "\"" + networkPassWord + "\"";
conf.wepTxKeyIndex = 0;
conf.status = WifiConfiguration.Status.ENABLED;
conf.allowedGroupCiphers.set(WifiConfiguration.GroupCipher.TKIP);
conf.allowedGroupCiphers.set(WifiConfiguration.GroupCipher.CCMP);
conf.allowedKeyManagement.set(WifiConfiguration.KeyMgmt.WPA_PSK);
conf.allowedPairwiseCiphers.set(WifiConfiguration.PairwiseCipher.TKIP);
conf.allowedPairwiseCiphers.set(WifiConfiguration.PairwiseCipher.CCMP);
conf.allowedProtocols.set(WifiConfiguration.Protocol.RSN);
conf.preSharedKey = "\""+ networkPassWord +"\"";
//conf.allowedKeyManagement.set(WifiConfiguration.KeyMgmt.NONE);
Log.d(TAG, "Initialising WIFI Manager");
int id = wifiManager.addNetwork(conf);
Log.d(TAG, "conf.SSID: "+conf.SSID);
Log.d(TAG, …Run Code Online (Sandbox Code Playgroud) 我正在创建一个应用程序,它可以列出ListView中所有可用的wifi.如果我选择列表中的一个wifi,它之前被缓存,List<WifiConfiguration> list = wifiManager.getConfiguredNetworks();那么它应该连接到它.如果WifiConfiguration列表不包含所选的wifi,则没有任何反应.我的问题是,有时我从列表中选择一个wifi(我肯定知道它在WifiConfiguration列表中),但它没有连接到它.相反,它连接回以前连接的WiFi.经过一些尝试(一次又一次地选择相同的wifi),它最终连接到它.这有时不会发生.可能是什么问题?这是我的代码片段:
// Go through all the cached wifis and check if the selected GoPro was cached before
for (WifiConfiguration config : configurations) {
// If it was cached connect to it and that's all
if (config.SSID != null && config.SSID.equals("\"" + mDrawerListView.getAdapter().getItem(position) + "\"")) {
// Log
Log.i("onReceive", "Connecting to: " + config.SSID);
mWifiManager.disconnect();
mWifiManager.enableNetwork(config.networkId, true);
mWifiManager.reconnect();
break;
}
}
Run Code Online (Sandbox Code Playgroud) Android 6.0对WiFi行为进行了一些更改,它破坏了我的应用行为,无法找到解决方案.
基本上,对于Android 6.0,您不得修改或删除非应用程序创建的WifiConfiguration对象.这意味着我需要始终创建自己的WifiConfiguration对象.但是,如果用户或其他应用程序已经为特定AP创建了WifiConfiguration,则无法为该AP创建另一个AP.
wifiManager.addNetwork(wifiConfiguration)返回-1.这适用于所有以前的Android版本,但不适用于Android 6.0
所以我被困住了.这是Android的错误吗?我想如果他们为具有自己的WiFi接入点的自定义硬件开发应用程序,很多开发人员应该受此影响.
我正在开发和通过wifi(由设备生成)连接到硬件设备并通过套接字连接向其发送数据的应用程序.问题是,当移动数据(3G/4G)被激活时,android会尝试通过它发送数据而不是通过设备生成的wifi发送数据,因为因为wifi没有互联网连接.我正在考虑使用ConnectivityManager#setNetworkPreference(),但它在api 21中已被弃用.
如何设置它使用设备生成的wifi而不是移动数据接口发送数据?
sockets android android-networking android-wifi network-interface
在 Android 9.0&8.0 中获取 SSID 没有问题,
但在 Android 10.0(Q) 中无法获取 SSID。
我应该怎么做?Android 10.0 中有关 wifi 的文档链接在哪里?我试图找到该文档,但找不到。
Android 9.0&8.0获取SSID没有问题
WifiManager mWifiManager = (WifiManager) context.getApplicationContext().getSystemService(Context.WIFI_SERVICE);
assert mWifiManager != null;
WifiInfo info = mWifiManager.getConnectionInfo();
return info.getSSID();
Run Code Online (Sandbox Code Playgroud)
ConnectivityManager connManager = (ConnectivityManager) context.getApplicationContext().getSystemService(Context.CONNECTIVITY_SERVICE);
assert connManager != null;
NetworkInfo networkInfo = connManager.getActiveNetworkInfo();
if (networkInfo.isConnected()) {
if (networkInfo.getExtraInfo() != null) {
return networkInfo.getExtraInfo().replace("\"", "");
}
}
Run Code Online (Sandbox Code Playgroud) android ×10
android-wifi ×10
java ×2
wifi ×2
access-point ×1
gprs ×1
networking ×1
sockets ×1
wifi-direct ×1