使用compileSdkVersion 23,但是尝试支持9到9.
getNetworkInfo(int)在23中已弃用.建议改为使用getAllNetworks和getNetworkInfo(Network).然而,这两者都需要最少的API 21.
我们可以在支持包中使用哪个类可以帮助解决这个问题吗?
我知道之前提出了一个解决方案,但是我对9的最小api要求的挑战造成了问题.
networking android android-6.0-marshmallow android-connectivitymanager
我正在建立一个VoIP应用程序.当用户在WiFi与移动数据之间切换时,在VoIP呼叫期间,我在处理场景时遇到问题.
在我的通话屏幕活动中,我已注册接收器,这有助于我获得有关网络更改方案的通知.
这是我用于检测onRecieve方法中网络变化的代码.
conn_name是包含先前连接名称的私有类级别变量.
ConnectivityManager connectivity_mgr = ((ConnectivityManager) context.getSystemService(Context.CONNECTIVITY_SERVICE));
NetworkInfo net_info = connectivity_mgr.getActiveNetworkInfo();
if (net_info != null && net_info.isConnectedOrConnecting() && !conn_name.equalsIgnoreCase("")) {
new_con = net_info.getExtraInfo();
if (new_con != null && !new_con.equalsIgnoreCase(conn_name))
network_changed = true;
conn_name = (new_con == null) ? "" : new_con;
connectionStatus ="connected";
} else {
if (net_info != null && conn_name.equalsIgnoreCase("")){
conn_name = net_info.getExtraInfo();
connectionStatus ="connected";
network_changed = true;
}else if(!new_con.equals(conn_name)) {
conn_name = "";
connectionStatus ="disconnected";
network_changed = true;
}
}
Run Code Online (Sandbox Code Playgroud)
所以使用上面的方法我能够检测网络变化.但是当我与WiFi连接时会发生一件奇怪的事情.
当我的应用程序最初启动时,它与移动数据连接.当用户进入他已知的WiFi区域时,他连接到他已知的WiFi.由于WiFi总是被选为默认路由,因此android会切换到WiFi,我会收到WiFi已经打开的网络通知.所以我将我的应用IP地址更新为WiFi IP地址.这里没有问题.但是移动数据仍然是连接的同时getActiveNetworkInfo() …
networking android android-wifi mobile-data android-connectivitymanager
我正在开发一个应用程序,用户必须在其中执行以下步骤:
当用户连接到所连接对象的专用热点时,应用程序会执行一些 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。
有人已经做到了吗?
预先感谢您的帮助。
我在尝试访问以下代码时收到 SecurityException 和 RemoteException。应用程序接口
val networkCapabilities =connectivityManager.getNetworkCapabilities(connectivityManager.activeNetwork)
异常获取
Fatal Exception: java.lang.SecurityException: Package android does not belong to 10319
at android.os.Parcel.createExceptionOrNull(Parcel.java:2385)
at android.os.Parcel.createException(Parcel.java:2369)
at android.os.Parcel.readException(Parcel.java:2352)
at android.os.Parcel.readException(Parcel.java:2294)
at android.net.IConnectivityManager$Stub$Proxy.getNetworkCapabilities(IConnectivityManager.java:3347)
at android.net.ConnectivityManager.getNetworkCapabilities(ConnectivityManager.java:1549)
Caused by android.os.RemoteException: Remote stack trace:
at android.app.AppOpsManager.checkPackage(AppOpsManager.java:7783)
at com.android.server.ConnectivityService.getNetworkCapabilities(ConnectivityService.java:2297)
at android.net.IConnectivityManager$Stub.onTransact(IConnectivityManager.java:1357)
at android.os.Binder.execTransactInternal(Binder.java:1195)
at android.os.Binder.execTransact(Binder.java:1159)
Run Code Online (Sandbox Code Playgroud)
我分析它,当我深入到AOSP代码,我得到的流量将会checkPackage从AppOpsManager类随附的屏幕截图,并从我们所知道的代码所示的方法,只要检查包的条件不等于MODE_ALLOWED那么只有我们将得到安全例外。但我没有。想法何时该条件会失败。
如果有人对此有任何想法,请帮助我,谢谢
android exception android-source android-app-ops android-connectivitymanager
我在更新API 28的Android应用程序时遇到了registerDefaultNetworkCallback和registerNetworkCallback.
审阅了文档后,我找不到注册网络回调和注册默认 网络回调之间的区别.
什么时候会用哪个?
提前致谢 :)
android network-programming callback android-connectivitymanager
我正在尝试使用 Android Q 上的 WifiNetworkSpecifier 连接到 WiFi。我遇到的问题是 Android 始终使用最后一个有效凭据连接到 AP,即使在我手动向 WifiNetworkSpecifier 提供新的更新凭据之后也是如此。
这是流程:
如果我颠倒逻辑,同样的事情会发生:
关键是,一旦它使用有效凭据连接到 SSID,无论我放入 WifiNetworkSpecifier 的任何内容似乎都没有任何区别,它只是一遍又一遍地使用最后一个有效凭据。
这发生在 Google Pixel 2 和华为 P30 Lite 上。但是,在三星 Galaxy S9 上一切正常(如果我更新 WiFi 网络密码并为应用程序提供新的有效密码,应用程序将连接到 WiFi 网络;如果我提供它,它将无法连接到 WiFi假密码,假设我们之前成功连接到 WiFi)。
重启设备后,Pixel 和华为的问题得到“解决”,但是当我再次连接到 WiFi 时(输入有效凭据),我们又回到了同样的问题。
我不确定我是否在这里遗漏了一些微不足道的东西,但任何帮助将不胜感激!谢谢!
编辑:事实证明,您不必输入有效凭据即可触发此循环。例如,如果您第一次尝试使用虚假密码连接AP,并且在尝试使用正确密码连接后,系统会使用此错误密码(第一次输入的密码)进行连接。同样,这种情况发生在 Pixel 2 和华为 P30 Lite 上,但在 Galaxy S9 和 S9+ 上运行良好。重新启动手机仍会清除此“状态”。
这是代码:
@RequiresApi(api = Build.VERSION_CODES.Q)
private fun connectToWiFiOnQ(context: Context, wifiCredentials: WifiCredentials) {
val connectivityManager: ConnectivityManager =
context.applicationContext.getSystemService(Context.CONNECTIVITY_SERVICE) as ConnectivityManager
val …Run Code Online (Sandbox Code Playgroud) android android-networking android-wifi android-connectivitymanager android-10.0
我正在尝试暂时强制设备使用移动数据。我在用ConnectivityManager.requestNetwork(),
NetworkRequest.Builder request = new NetworkRequest.Builder();
request.addCapability(NetworkCapabilities.NET_CAPABILITY_INTERNET);
request.addTransportType(NetworkCapabilities.TRANSPORT_CELLULAR);
connectivityManager.requestNetwork(request.build(), newRequestTransportCallback(connectivityManager),
(int) TimeUnit.SECONDS.toMillis(10));
Run Code Online (Sandbox Code Playgroud)
哪里newRequestTransportCallback()的回报,
new ConnectivityManager.NetworkCallback() {
@Override
public void onAvailable(Network network) {
Log.d(TAG,"Network available: " + network + ", binding...");
if (cm.bindProcessToNetwork(network)) {
Log.d(TAG,"Bind successful to network: " + network);
} else {
Log.w(TAG,"Bind failed to network: " + network);
}
}
@Override
public void onUnavailable() {
Log.w(TAG,"Network not available");
}
};
Run Code Online (Sandbox Code Playgroud)
我可以从我的日志语句中看到请求和绑定成功。但是,当我随后调用ConnectivityManager.getNetworkInfo(ConnectivityManager.TYPE_MOBILE)它时,它告诉我网络已断开连接(并且我尝试轮询以查看更新网络信息是否有延迟,但也没有成功)。
根据官方文档,由于 getActiveNetworkInfo 现在在 Android 中已被弃用,因此我使用下面的实现来获取有关互联网连接的回调。
private val connectivityManager: ConnectivityManager by lazy {
getSystemService(Context.CONNECTIVITY_SERVICE) as ConnectivityManager
}
private val builder: NetworkRequest.Builder by lazy {
NetworkRequest.Builder()
}
private val networkCallback: NetworkCallback by lazy {
object : NetworkCallback() {
override fun onAvailable(network: Network?) {
println("Connection is online")
}
override fun onLost(network: Network?) {
println("Connection is offline")
}
}
}
override fun onResume() {
super.onResume()
connectivityManager.registerNetworkCallback(builder.build(), networkCallback)
}
override fun onPause() {
super.onPause()
connectivityManager.unregisterNetworkCallback(networkCallback)
}
Run Code Online (Sandbox Code Playgroud)
当连接在线时注册此回调时,它可以正常工作,但当互联网关闭然后我们注册回调时,它不能正常工作。为了测试这种情况,我关闭了我的应用程序。然后保持互联网连接关闭,然后打开应用程序。
我们有什么办法知道应用程序正在打开吗?如果有的话,请帮忙分享一下。谢谢。
我的 Android 应用程序已注册 ConnectivityManager onAvailable 和 onLost NetworkCallbacks,但当 VPN(我正在使用 OpenVPN 应用程序进行测试)连接或断开连接时,不会调用它们。当蜂窝网络连接/断开时,他们确实会被呼叫。
在我连接 VPN 之前,allNetworks 显示一个网络:
11-17 16:16:22.719 23531 23531 I Baresip : 找到网络 106 [ 传输:蜂窝功能:SUPL&INTERNET&NOT_RESTRICTED&TRUSTED&NOT_VPN&VALIDATED&NOT_ROAMING&FOREGROUND&NOT_CONGESTED&NOT_SUSPENDED 不需要的:LinkUpBandwidth>=5 1200Kbps LinkDnBandwidth>=102400Kbps 说明符:<6>]
连接VPN后,有两个网络:
11-17 16:17:17.464 23531 23531 I Baresip : 找到网络 106 [ 传输:蜂窝功能:SUPL&INTERNET&NOT_RESTRICTED&TRUSTED&NOT_VPN&VALIDATED&NOT_ROAMING&FOREGROUND&NOT_CONGESTED&NOT_SUSPENDED 不需要的:LinkUpBandwidth>=5 1200Kbps LinkDnBandwidth>=102400Kbps 说明符:<6>]
11-17 16:17:17.466 23531 23531 I Baresip : 找到网络 225 [ 传输:VPN 功能:INTERNET&NOT_RESTRICTED&TRUSTED&VALIDATED&NOT_ROAMING&FOREGROUND&NOT_CONGESTED&NOT_SUSPENDED 不需要的:]
但是,当 VPN 网络可用时,我的应用程序不会收到有关它的可用(或任何其他)ConnectivityManager 通知。同样的问题,当我断开 VPN 时。
这是 Android 错误还是有其他方法可以获取有关 VPN 事件的通知?
编辑:我搜索了谷歌的问题跟踪器并发现了完全相同的问题:
https://issuetracker.google.com/issues/138035152
不幸的是,作者没有提供谷歌要求的所有信息,他们关闭了这个问题。
我创建了一个新的错误报告,但很可能它不会导致任何结果:
https://issuetracker.google.com/issues/173534857
因此,欢迎社区的帮助。
我不明白为什么在随机时刻多次调用 onAvailable ,文档说明如果网络发生变化可以调用更多,但是 onAvailable 中网络对象参数的属性始终相同。我什至比较了哈希码,它们是相同的......
问题出现在我的 LG 棒棒糖设备上
Android 文档:(https://developer.android.com/reference/android/net/ConnectivityManager.NetworkCallback)
onAvailable 在 API 级别 21 中添加当框架连接并声明新网络可供使用时调用。如果满足请求的网络发生变化,则此回调可能会被多次调用
编辑:我已经从回调中实现了其他方法来检查是否有任何其他方法被触发(onLosing、onUnavailable、onCapabilitiesChanged、onLinkPropertiesChanged),但这些方法都没有被调用
我有自己的 NetworkManager,其中包含以下代码:
public void initialize(Context context) {
connectivityManager = (ConnectivityManager) context.getSystemService(Context.CONNECTIVITY_SERVICE);
setState();
if (android.os.Build.VERSION.SDK_INT >= android.os.Build.VERSION_CODES.LOLLIPOP) {
final NetworkRequest networkRequest = new NetworkRequest.Builder()
.addTransportType(NetworkCapabilities.TRANSPORT_CELLULAR)
.addTransportType(NetworkCapabilities.TRANSPORT_WIFI).build();
connectivityManager.registerNetworkCallback(networkRequest, new ConnectivityManager.NetworkCallback() {
@Override
public void onAvailable(final Network network) {
super.onAvailable(network);
NetworkInfo networkInfo = connectivityManager.getNetworkInfo(network);
Log.d(TAG,"Network is Available. Network Info: " + networkInfo);
notifyObservers();
}
@Override
public void onLost(final Network network) {
super.onLost(network);
notifyObservers(); …Run Code Online (Sandbox Code Playgroud) android ×10
android-connectivitymanager ×10
android-wifi ×3
networking ×2
android-10.0 ×1
callback ×1
exception ×1
java ×1
mobile-data ×1
vpn ×1