我有一个应用程序,我通过WiFI发送网络数据.一切都很好,直到我关闭显示器或设备进入"睡眠"状态.我已经锁定了WiFi,但似乎是在睡眠时CPU速度下降导致流式传输不正常的情况(即数据包的流速不如我想的那样快设备没有睡觉).
我知道我可能/可能应该在协议级别解决这个问题,但这可能也不可能 ......
有没有办法 "在屏幕关闭时防止CPU进入'睡眠'"?如果是这样,怎么样?如果没有,关于如何保持WiFi流的速度的任何建议是否一致,无论设备是否处于睡眠模式?
正如标题所说......我试图在配置为热点时能够获得wifi的IP.理想情况下,我想找到适合所有手机的东西.
当然,在从AP获取信息时,WifiManager是无用的.
幸运的是,通过这样做,我已经能够获得所有接口的IP:
public String getLocalIpAddress() {
try {
for (Enumeration<NetworkInterface> en = NetworkInterface.getNetworkInterfaces(); en.hasMoreElements();) {
NetworkInterface intf = en.nextElement();
for (Enumeration<InetAddress> enumIpAddr = intf.getInetAddresses(); enumIpAddr.hasMoreElements();) {
InetAddress inetAddress = enumIpAddr.nextElement();
if (!inetAddress.isLoopbackAddress()) {
Log.d("IPs", inetAddress.getHostAddress() );
}
}
}
} catch (SocketException ex) {
Log.e(LOG_TAG, ex.toString());
}
return null;
}
Run Code Online (Sandbox Code Playgroud)
这段代码将打印所有接口的所有IP(包括Wifi热点).主要问题是我找不到识别WiFi接口的方法.这是一个问题,因为有些手机有多个接口(WiMax等).这是我到目前为止所尝试的:
有什么建议?
我正在开发一个应用程序,用户必须在其中执行以下步骤:
当用户连接到所连接对象的专用热点时,应用程序会执行一些 HTTP 请求以对其进行配置。然后,我想将应用程序自动重新连接到步骤 1 的全局 wifi。
从 API 21 到 API 28,此功能非常容易实现,因为我知道 SSID,我也想重新连接手机。它可以通过几行代码完成:
private fun changeCurrentWifiNetworkLegacy(ssidToConnect: String) {
val wifiManager = applicationContext.getSystemService(Context.WIFI_SERVICE) as WifiManager
var ssidIdentifier: Int? = null
wifiManager.configuredNetworks?.forEach { config ->
Log.d("SSID", config.SSID)
if (config.SSID == "\"${ssidToConnect}\"") {
ssidIdentifier = config.networkId
}
}
ssidIdentifier?.let { id ->
wifiManager.enableNetwork(id, true)
}
}
Run Code Online (Sandbox Code Playgroud)
在 API 29 上,根据这篇文章,这个简单的代码不再起作用:https : //developer.android.com/about/versions/10/privacy/changes#configure-wifi
根据文章,现在,我应该使用 2 个类:WifiNetworkSpecifier和/或WifiNetworkSuggestion.
不幸的是,我找不到使用这些类的工作示例来将用户连接到以前配置的 SSID。
有人已经做到了吗?
预先感谢您的帮助。
我有这个功能可以在 Wifi 网络中连接,在 Android 10 以下它工作正常,但是当我在 Android 10 上尝试时,我成功连接但没有互联网,我知道这是Android 10 中的一个错误,但我发现这个应用程序可以连接从 Android 10 连接到 wifi 没有问题。我被屏蔽了好几天。
我的功能:
private void connectToWifi(String ssid, String password)
{
WifiManager wifiManager = (WifiManager) getSystemService(WIFI_SERVICE);
if (Build.VERSION.SDK_INT < Build.VERSION_CODES.Q) {
try {
Log.e(TAG,"connection wifi pre Q");
WifiConfiguration wifiConfig = new WifiConfiguration();
wifiConfig.SSID = "\"" + ssid + "\"";
wifiConfig.preSharedKey = "\"" + password + "\"";
int netId = wifiManager.addNetwork(wifiConfig);
wifiManager.disconnect();
wifiManager.enableNetwork(netId, true);
wifiManager.reconnect();
} catch ( Exception e) …Run Code Online (Sandbox Code Playgroud) 我有一个原型Android应用程序正在侦听多播数据包以"发现"客户端进行通信.套接字设置类似于:
InetAddress group = InetAddress.getByName("228.1.2.3");
MulticastSocket s = new MulticastSocket(4000);
s.joinGroup(group);
Run Code Online (Sandbox Code Playgroud)
当所有设备通过WiFi连接时,这非常有效.我想用手机充当便携式热点来支持这一点.但是,虽然我的所有设备似乎都正确连接到热点,但我不再收到组播数据.我想知道是否存在禁止在热点模式下进行此类通信的限制,或者是否需要任何其他网络配置才能启用此功能?我在运行Gingerbread和Froyo的几个不同的设备上试过这个没有运气.
目前,我使用MAC地址作为Android设备的标识符.
WifiManager wifiManager = (WifiManager) getSystemService(Context.WIFI_SERVICE);
WifiInfo wInfo = wifiManager.getConnectionInfo();
String mac = wInfo.getMacAddress();
Run Code Online (Sandbox Code Playgroud)
但是,我发现mac某些用户的设备是空的.我有点困惑为什么它可能是空的.
如果你能找出原因,那就是最好的!
否则,您能否提供识别Android设备的替代方案?
我的应用程序启动时只需要一个粗略的位置服务.
详细地说,我需要应用程序的粗略位置,以便为用户提供附近的商店信息.
该位置不需要不断更新.此外,在这种情况下,粗略定位就足够了.
我希望应用程序自动选择GSM,wifi或GPS,无论哪个可用.
定位服务也应该是一次性的,以节省电话能量.
我该怎么办?
我曾尝试单独使用GPS.
我的问题是我不知道如何停止GPS的持续刷新位置功能.我不知道如何让手机从三种方法中选择一种.
非常感谢一些示例代码或想法.
我正在开发基于使用Wifi Direct API 的Android应用程序.我已在我的Activitya BroadcastReceiver中注册,以便收到有关以下Wifi Direct事件的通知:
WifiP2pManager.WIFI_P2P_STATE_CHANGED_ACTION
WifiP2pManager.WIFI_P2P_PEERS_CHANGED_ACTION
WifiP2pManager.WIFI_P2P_CONNECTION_CHANGED_ACTION
WifiP2pManager.WIFI_P2P_THIS_DEVICE_CHANGED_ACTION
Run Code Online (Sandbox Code Playgroud)
我相信对等列表中的任何更改(包含或排除Wifi Direct范围内的对等点)都可能触发BroadcastReceiver.在我的应用中,当找到新的对等体时,其名称正确地包含在a中ListView,但如果对等体离开无线范围(或者如果我关闭其Wi-Fi接口),BroadcastReceiver则不会调用(更具体地说,
WifiP2pManager.WIFI_P2P_PEERS_CHANGED_ACTION
Run Code Online (Sandbox Code Playgroud)
事件未被触发),并且对等名称保留在ListView.
我想知道是否有任何方式来处理这个问题,因为对等名称包含在中ListView,但从未排除.我已经考虑重新初始化Channel和WifiP2pManager实例,但我相信这会断开所有同行.
我必须将UDP数据包发送到没有互联网连接的WiFi模块(提供自己的AP)但是当我将移动设备连接到AP时,Android会重定向移动数据接口上的数据包,因为它已经连接了互联网.
我已经使用下面的代码来完成我的工作,但它似乎不适用于Android M.
@TargetApi(Build.VERSION_CODES.LOLLIPOP)
private void setWifiInterfaceAsDefault() {
ConnectivityManager connectivityManager = (ConnectivityManager) getSystemService(Context.CONNECTIVITY_SERVICE);
NetworkRequest.Builder builder = new NetworkRequest.Builder();
NetworkRequest networkRequest= builder.addCapability(NetworkCapabilities.NET_CAPABILITY_NOT_RESTRICTED)
.addTransportType(NetworkCapabilities.TRANSPORT_WIFI)
.build();
connectivityManager.requestNetwork(networkRequest, new ConnectivityManager.NetworkCallback());
}
Run Code Online (Sandbox Code Playgroud)
我还补充道
<uses-permission android:name="android.permission.CHANGE_NETWORK_STATE" />
<uses-permission android:name="android.permission.WRITE_SETTINGS" />
Run Code Online (Sandbox Code Playgroud)
在我的AndroidManifest.xml上,我确保自己Settings.System.canWrite(this)返回true但仍然没有.
提前致谢.
我想使用Android设备上的内置Wi-Fi热点启动本地网络连接.有办法实现吗?以及如何在两个设备之间进行通信?
编辑:我想以编程方式进行.然后我可以在设备之间传输我自己的数据.
android ×10
android-wifi ×10
wifi ×3
android-10.0 ×1
android-connectivitymanager ×1
cpu-speed ×1
iot ×1
java ×1
multicast ×1
networking ×1
sleep-mode ×1
throttling ×1
wifi-direct ×1
wifimanager ×1
wifip2p ×1