我正在尝试通过内部 wifi 网络将远程数据发送到 App Center,但它不是在此网络上发送,而是在任何外部网络上发送。调试时发现当设备连接到内部 wifi 时不会调用方法 onAvailable() 但当连接到任何外部 wifi 时它会被调用。
以下代码来自 App Center SDK :
应用程序中心\实用程序\NetworkStateHelper.javaNetworkStateHelper.java。
类 NetworkStateHelper -> 方法 reopen() --> public void onAvailable(Network network) 方法
示例代码:
private ConnectivityManager.NetworkCallback mNetworkCallback = new ConnectivityManager.NetworkCallback()
{
@Override
public void onAvailable(Network network) {
onNetworkAvailable(network);
}
@Override
public void onLost(Network network) {
onNetworkLost(network);
}
};
连接到内部wifi网络时应该调用onAvailable方法。
您必须将网络类型限制为Wifi。
1。建立
NetworkRequest
:
val networkRequest = getNetworkRequest()
private fun getNetworkRequest(): NetworkRequest {
return NetworkRequest.Builder()
.addTransportType(NetworkCapabilities.TRANSPORT_WIFI) //here!!
.build()
}
2。建立
NetworkCallback
:
val networkCallback = getNetworkCallBack()
private fun getNetworkCallBack(): ConnectivityManager.NetworkCallback {
return object : ConnectivityManager.NetworkCallback() {
override fun onAvailable(network: Network) { //when Wifi is on
super.onAvailable(network)
Toast.makeText(requireContext(), "Wifi is on!", Toast.LENGTH_SHORT).show()
}
override fun onLost(network: Network) { //when Wifi 【turns off】
super.onLost(network)
Toast.makeText(requireContext(), "Wifi turns off!", Toast.LENGTH_SHORT).show()
}
}
}
3。注册和注销:
fun getConnectivityManager() = requireContext().getSystemService(Context.CONNECTIVITY_SERVICE) as ConnectivityManager
override fun onResume() { //start monitoring when in the foreground
super.onResume()
getConnectivityManager().registerNetworkCallback(networkRequest, networkCallback)
}
override fun onPause() { //stop monitoring when not fully visible
super.onPause()
getConnectivityManager().unregisterNetworkCallback(networkCallback)
}
4。不要忘记权限:
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
As written in the android docs :
针对 Android 7.0(API 级别 24)及更高版本的应用程序不接收 CONNECTIVITY_ACTION 广播,如果他们声明广播接收器 在他们的清单中。应用仍会收到 CONNECTIVITY_ACTION 如果他们注册他们的 BroadcastReceiver 则广播 Context.registerReceiver() 并且该上下文仍然有效。
这意味着如果您的目标 api 高于 24,则您需要在活动开始时注册广播接收器。
在你的活动中
onCreate()
IntentFilter intentFilter = new IntentFilter(ConnectivityManager.CONNECTIVITY_ACTION);
registerReceiver(connectivityReceiver, intentFilter);
宣布广播:
private BroadcastReceiver connectivityReceiver = new BroadcastReceiver() {
@Override
public void onReceive(Context context, Intent intent) {
//check state here....
}
};
我有一个问题,我想刷新(强制刷新)因为
public void onCapabilitiesChanged(Network network, NetworkCapabilities networkCapabilities)
不会迅速改变。
connectivityManager = (ConnectivityManager) getSystemService(Context.CONNECTIVITY_SERVICE);
NetworkRequest networkRequest = new NetworkRequest.Builder()
.addTransportType(NetworkCapabilities.TRANSPORT_WIFI)
.addTransportType(NetworkCapabilities.TRANSPORT_CELLULAR)
.addCapability(NetworkCapabilities.NET_CAPABILITY_INTERNET)
.addCapability(NetworkCapabilities.NET_CAPABILITY_NOT_RESTRICTED)
.build();
wifiBande1Infos = new JSONObject();
wifiBande2Infos = new JSONObject();
NetworkCallback networkCallback = new ConnectivityManager.NetworkCallback(ConnectivityManager.NetworkCallback.FLAG_INCLUDE_LOCATION_INFO) {
@Override
public void onAvailable(Network network) {
}
@Override
public void onLost(Network network) {
}
@Override
public void onLinkPropertiesChanged(Network network, LinkProperties linkProperties) {
}
@Override
public void onCapabilitiesChanged(Network network, NetworkCapabilities networkCapabilities) {
super.onCapabilitiesChanged(network, networkCapabilities);
executor.execute(() -> {
Network activeNetwork = connectivityManager.getActiveNetwork();
LinkProperties linkProperties = connectivityManager.getLinkProperties(activeNetwork);
linkProperties = connectivityManager.getLinkProperties(network);
interfaceName = linkProperties.getInterfaceName();
WifiInfo wifiInfo = (WifiInfo) networkCapabilities.getTransportInfo();
if (wifiInfo != null) {
String ssid = wifiInfo.getSSID();
try {
if (interfaceName.equals("wlan0")) {
JSONObject ssidEntry = new JSONObject();
ssidEntry.put("getRssi", String.valueOf(wifiInfo.getRssi()));
ssidEntry.put("getRssi2", String.valueOf(networkCapabilities.getSignalStrength()));
JSONArray ssidEntryArray = new JSONArray();
ssidEntryArray.put(ssidEntry);
wifiBande1Infos.put(interfaceName, ssidEntryArray);
} else if (interfaceName.equals("wlan1")) {
JSONObject ssidEntry = new JSONObject();
ssidEntry.put("getRssi", String.valueOf(wifiInfo.getRssi()));
ssidEntry.put("getRssi2", String.valueOf(networkCapabilities.getSignalStrength()));
JSONArray ssidEntryArray = new JSONArray();
ssidEntryArray.put(ssidEntry);
wifiBande2Infos.put(interfaceName, ssidEntryArray);
}
refreshInfosWifi();
} catch (JSONException e) {
Log.e(TAG, "Error Connection 152", e);
e.printStackTrace();
}
}
});
}
};
connectivityManager.registerNetworkCallback(networkRequest, networkCallback);
connectivityManager.requestNetwork(networkRequest, networkCallback);
scheduler = Executors.newScheduledThreadPool(1);
scheduler.scheduleAtFixedRate(new Runnable() {
@Override
public void run() {
try {
updateRSSI();
} catch (JSONException e) {
throw new RuntimeException(e);
}
}
}, 0, 1, TimeUnit.SECONDS);
private void updateRSSI() throws JSONException {
WifiManager wifiManager = (WifiManager) getSystemService(Context.WIFI_SERVICE);
WifiInfo wifiInfo = wifiManager.getConnectionInfo();
int wlan0_rssi_old = wifiInfo.getRssi();
//Log.d(TAG, "Refresh 2s : Rssi Wlan0 OLD : "+wlan0_rssi_old);
if(!wifiBande1Infos.isNull("wlan0")) {
JSONArray wifiBande1InfosArray = wifiBande1Infos.getJSONArray("wlan0");
JSONObject wifiBande1InfosObj = wifiBande1InfosArray.getJSONObject(0);
ConnectivityManager connectivityManager = (ConnectivityManager) getSystemService(Context.CONNECTIVITY_SERVICE);
NetworkCapabilities networkCapabilities = connectivityManager.getNetworkCapabilities((Network) wifiBande1InfosObj.get("IdNetworkMaster"));
WifiInfo wifiInfoRefresh = (WifiInfo) networkCapabilities.getTransportInfo();
}
if(!wifiBande2Infos.isNull("wlan1")) {
JSONArray wifiBande2InfosArray = wifiBande2Infos.getJSONArray("wlan1");
JSONObject wifiBande2InfosObj = wifiBande2InfosArray.getJSONObject(0);
ConnectivityManager connectivityManager = (ConnectivityManager) getSystemService(Context.CONNECTIVITY_SERVICE);
NetworkCapabilities networkCapabilities = connectivityManager.getNetworkCapabilities((Network) wifiBande2InfosObj.get("IdNetworkMaster"));
WifiInfo wifiInfoRefresh = (WifiInfo) networkCapabilities.getTransportInfo();
}
runOnUiThread(new Runnable() {
@Override
public void run() {
TextView T_wifiRSSI_old_txt = findViewById(R.id.wifiRSSI_old_txt);
T_wifiRSSI_old_txt.setText(String.valueOf(wlan0_rssi_old)+" dBm");
ProgressBar P_wifiRSSI_old = findViewById(R.id.wifiRSSI_old);
P_wifiRSSI_old.setProgress(Integer.parseInt(String.valueOf(wlan0_rssi_old)));
}
});
}
正如你在上面看到的,我使用的是最新的 API >=33,反正我的应用程序只能在 33 下运行。
目标是比较 RSSI 刷新:
WifiInfo wifiInfo = wifiManager.getConnectionInfo();
WifiInfo wifiInfoRefresh = (WifiInfo) networkCapabilities.getTransportInfo();
我看到强制刷新在旧方法上效果很好。 另一方面,根据新闻,我既不能更新 onCapabilitiesChanged,也不能自己获取值。
我一定做错了,你能纠正我的错误吗?
我添加到这个新方法的一个非常奇怪的效果,低于 -50 dBm 2 个 wlans 不再更新。另一方面,旧方法适用于 -1dbm。除非有可能通过新方法实际强制刷新。
预先感谢任何可以帮助我的人,我已经研究了好几天了...:)