我的应用程序在升级到Marshmallow后停止工作,应该可以更改WiFi连接,但现在它根本不做任何事情。
我花了一些时间阅读有关Android 6.0的新权限模型。太棒了,但旧的应用程序应该继续工作...无论如何,我开始尝试实现授予权限,但意识到这是一个正常的权限,如果它定义在那里应该没有权限请求它android清单:
<uses-permission android:name="android.permission.CHANGE_WIFI_STATE" />
权限一直在Android Manifest中,如果我理解正确,它应该起作用,因为它是&#34;正常权限&#34;。那么为什么它不起作用,有人有解决方案吗?
添加与我的案例相关的代码片段:
protected void connectWifi() {
if ((!connectedToAccessPoint(settings.getMainConnectionName()))
&& (accessPointIsAvailable(settings.getMainConnectionName()))) {
ConnectionUtils.connectToWifi(this,
settings.getMainConnectionName(),
settings.getMainConnectionPassword());
Toast.makeText(this,
"Connecting to " + settings.getMainConnectionName(),
Toast.LENGTH_LONG).show();
handler.postDelayed(sendUpdatesToUI,
DelayConstants.BASIC_REQUEST_SENT);
handler.postDelayed(sendUpdatesToUI,
DelayConstants.CHANGE_CONNECTION);
}
}
这里是连接的技术部分:
public static void connectToWifi(Context context, String ssid, String password) {
WifiManager wifiManager = (WifiManager) context.getSystemService(Context.WIFI_SERVICE);
// setup a wifi configuration
WifiConfiguration wc = new WifiConfiguration();
wc.SSID = "\"" + ssid + "\"";
wc.preSharedKey = "\""+ password + "\"";
wc.status = WifiConfiguration.Status.ENABLED;
wc.allowedGroupCiphers.set(WifiConfiguration.GroupCipher.TKIP);
wc.allowedGroupCiphers.set(WifiConfiguration.GroupCipher.CCMP);
wc.allowedKeyManagement.set(WifiConfiguration.KeyMgmt.WPA_PSK);
wc.allowedPairwiseCiphers.set(WifiConfiguration.PairwiseCipher.TKIP);
wc.allowedPairwiseCiphers.set(WifiConfiguration.PairwiseCipher.CCMP);
wc.allowedProtocols.set(WifiConfiguration.Protocol.RSN);
// connect to and enable the connection
int netId = wifiManager.addNetwork(wc);
wifiManager.enableNetwork(netId, true);
wifiManager.setWifiEnabled(true);
}
在前面提到过的AndroidManifest中有CHANGE_WIFI_STATE权限,自应用程序在没有安装Android 6.0的设备上运行以来就存在该权限
答案 0 :(得分:3)
所以我最终在人们评论和阅读网页的帮助下弄明白了。毕竟这是一个权限问题。
为了在从Android 6.0扫描Connections时能够很好地使用WifiManager,它需要访问您的位置,因此无论是精确位置还是粗略位置,我都将以下内容添加到我的Manifest文件中:
<uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" />
我正在检查我的代码是否在连接之前连接是否可用,以及它为什么永远不会工作,它总是从网络扫描返回0结果,因为缺少权限。因此,在标准方式中,需要执行实现以请求ACCESS_COARSE_LOCATION权限,之后它将无效,除非您在Android中打开了您的位置设置。如果我每次都需要打开位置,它实际上会让我的应用程序变得毫无用处......
最后,我做了一个工作,没有检查接入点是否可用,只是尝试使用try-catch语句来尝试连接它。这很难看,但这是新Android的唯一方法。
我确实喜欢这种新的权限模式,但显然Google在某些方面的实施工作非常糟糕。为什么现在需要打开位置才能获得WiFi扫描结果????没有任何意义,因为它在没有它的情况下在Android 6.0之前运行。我确实理解有关位置许可,但实际上必须打开位置才能扫描WiFi上的可用内容是完全错误的......
答案 1 :(得分:3)
优秀的辅导建议:
* Marshmallow上的App需要ACCESS_COARSE_LOCATION或ACCESS_FINE_LOCATION权限,并且应启用位置服务以获取wifi扫描结果
您可以在以下网址了解更多相关信息: http://www.intentfilter.com/2016/08/programatically-connecting-to-wifi.html
阅读从 Marshmallow 开始的限制是该应用只能修改它已创建的那些WiFi网络。系统不允许修改其他应用或用户创建的网络。因此,如果列表中已存在网络,则添加网络可能会失败(一旦检测到系统,系统可能会自动连接到网络)。