标签: android-wifi

在Android中关闭屏幕时如何防止CPU"休眠"?

我有一个应用程序,我通过WiFI发送网络数据.一切都很好,直到我关闭显示器或设备进入"睡眠"状态.我已经锁定了WiFi,但似乎是在睡眠时CPU速度下降导致流式传输不正常的情况(即数据包的流速不如我想的那样快设备没有睡觉).

我知道我可能/可能应该在协议级别解决这个问题,但这可能也不可能 ......

没有办法 "在屏幕关闭时防止CPU进入'睡眠'"?如果是这样,怎么样?如果没有,关于如何保持WiFi流的速度的任何建议是否一致,无论设备是否处于睡眠模式?

android throttling cpu-speed android-wifi sleep-mode

15
推荐指数
2
解决办法
1万
查看次数

如何在Android中获取wifi热点的IP?

正如标题所说......我试图在配置为热点时能够获得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等).这是我到目前为止所尝试的:

  • 通过wifi iface显示名称进行过滤:这不是一个好方法,因为显示名称从一个设备更改为另一个设备(wlan0,eth0,wl0.1等).
  • 通过其mac地址过滤:几乎可以工作,但在某些设备上,热点iface没有MAC地址(iface.getHardwareAddress()返回null)...所以不是有效的解决方案.

有什么建议?

java android wifi android-wifi

15
推荐指数
2
解决办法
2万
查看次数

Android 10 / API 29:如何将手机连接到配置的网络?

我正在开发一个应用程序,用户必须在其中执行以下步骤:

  1. 将手机连接到wifi;
  2. 将手机从连接的对象连接到专用热点。

当用户连接到所连接对象的专用热点时,应用程序会执行一些 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。

有人已经做到了吗?

预先感谢您的帮助。

android android-wifi android-connectivitymanager

15
推荐指数
2
解决办法
8329
查看次数

以编程方式连接到 Android Q 中的 Wifi

我有这个功能可以在 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 wifi android-wifi android-10.0

15
推荐指数
3
解决办法
7258
查看次数

Android中的热点/绑定模式下的多播支持

我有一个原型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的几个不同的设备上试过这个没有运气.

android multicast wifi android-wifi

14
推荐指数
1
解决办法
4768
查看次数

如何通过编程方式识别Android设备?

目前,我使用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设备的替代方案?

android android-wifi

14
推荐指数
2
解决办法
3万
查看次数

如何使用Wifi或GSM或GPS获取粗略位置,以哪个可用?

我的应用程序启动时只需要一个粗略的位置服务.

详细地说,我需要应用程序的粗略位置,以便为用户提供附近的商店信息.

该位置不需要不断更新.此外,在这种情况下,粗略定位就足够了.

我希望应用程序自动选择GSM,wifi或GPS,无论哪个可用.

定位服务也应该是一次性的,以节省电话能量.

我该怎么办?

我曾尝试单独使用GPS.

我的问题是我不知道如何停止GPS的持续刷新位置功能.我不知道如何让手机从三种方法中选择一种.

非常感谢一些示例代码或想法.

android android-location android-wifi

14
推荐指数
2
解决办法
3万
查看次数

如何在Wi-Fi Direct范围内不再提供对等设备时收到通知?

我正在开发基于使用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实例,但我相信这会断开所有同行.

android wifimanager android-wifi wifi-direct wifip2p

14
推荐指数
1
解决办法
3301
查看次数

即使Android M上的移动数据为ON(带连接),也可通过WiFi(无连接)发送请求

我必须将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但仍然没有.

提前致谢.

networking android android-wifi iot android-6.0-marshmallow

14
推荐指数
2
解决办法
3871
查看次数

如何通过Android上的Wi-Fi热点以编程方式启动本地网络连接?

我想使用Android设备上的内置Wi-Fi热点启动本地网络连接.有办法实现吗?以及如何在两个设备之间进行通信?

编辑:我想以编程方式进行.然后我可以在设备之间传输我自己的数据.

android local-network android-wifi

13
推荐指数
1
解决办法
9054
查看次数