通过在SO上搜索,我找到了一种方法来扫描区域中的WiFi网络并通过TextView显示这些结果。下面是代码:OnReceive未被调用,因为它应该
保护无效的onCreate(捆绑savedInstanceState){
super.onCreate(savedInstanceState);
setContentView(R.layout.wifinetworks);
mainText = (TextView) findViewById(R.id.mainText);
mainText.setText("");
mWifiManager = (WifiManager) getApplicationContext().getSystemService(Context.WIFI_SERVICE);
if(mWifiManager.isWifiEnabled()==false)
{
mWifiManager.setWifiEnabled(true);
}
receiverWifi = new WifiReceiver();
IntentFilter intentFilter = new IntentFilter();
intentFilter.addAction(WifiManager.SCAN_RESULTS_AVAILABLE_ACTION);
registerReceiver(receiverWifi, intentFilter);
mainText.setText("Starting Scan...");
mWifiManager.startScan();
}
public class WifiReceiver extends BroadcastReceiver {
@Override
public void onReceive(Context context, Intent intent) {
Log.i(debugString, "I am in onRecieve");
List<ScanResult> wifiScanList = mWifiManager.getScanResults();
mainText.setText("");
for (int i = 0; i < wifiScanList.size(); i++) {
String info = (wifiScanList.get(i).toString());
mainText.append(info + "\n\n");
}
}
}
日志声明似乎永远不会被调用,我有以下权限在我的清单文件:
<uses-permission android:name="android.permission.INTERNET"/>
<uses-permission android:name="android.permission.ACCESS_WIFI_STATE"/>
<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION"/>
<uses-permission android:name="android.permission.CHANGE_WIFI_STATE"/>
这里可能会出现什么问题?感谢任何建议。
编辑:我意识到,我没有说过我是在清单接收器,所以我做了一个WifiReceiver类(变化是以上),并宣布它像这样:
<receiver android:name="com.example.alexander.bluetoothcontroller.MainActivity$WifiReceiver" android:exported="true">
<intent-filter>
<action android:name="android.intent.action.BOOT_COMPLETED"/>
<action android:name="android.intent.action.INPUT_METHOD_CHANGED" />
</intent-filter>
</receiver>
然而,这仍然没有任何改变除非我在声明中遗漏了某些东西。我还添加了建议的额外权限,但仍然没有任何变化。我注意到这个在logcat中突出的调用堆栈:
08-09 14:27:17.821 1579-1622 /? E/WifiHW:无法停止请求方 08-09 14:27:17.821 1579-1622 /? E/wifi:无法初始化供应商功能指针表 08-09 14:27:17.821 1579-1622 /? E/WifiNative-HAL:无法启动hal 08-09 14:27:17.821 1579-1622 /? E/WifiStateMachine:无法启动HAL 08-09 14:27:17.821 1579-1622 /? E/WifiHW:无法打开“/system/etc/wifi/wpa_supplicant.conf”:没有这样的文件或目录 08-09 14:27:17.821 1579-1622 /? E/WifiHW:Wi-Fi将不会启用 08-09 14:27:17.821 1579-1622 /? E/WifiStateMachine:无法启动请求者! 08-09 14:27:17.822 1579-1579 /? E/WifiController:WifiControllerWifi打开失败
难道这是问题吗?
编辑2:
所以,我想检查在运行时的权限,但仍然没有改变。
private boolean checkAndRequestPermissions() {
int wifi_state = ContextCompat.checkSelfPermission(this, permission.ACCESS_WIFI_STATE);
int change_wifi_state = ContextCompat.checkSelfPermission(this, permission.CHANGE_WIFI_STATE);
int loc = ContextCompat.checkSelfPermission(this, android.Manifest.permission.ACCESS_COARSE_LOCATION);
int loc2 = ContextCompat.checkSelfPermission(this, android.Manifest.permission.ACCESS_FINE_LOCATION);
int internet = ContextCompat.checkSelfPermission(this, permission.INTERNET);
List<String> listPermissionsNeeded = new ArrayList<>();
if (wifi_state != PackageManager.PERMISSION_GRANTED) {
listPermissionsNeeded.add(permission.ACCESS_WIFI_STATE);
}
if (change_wifi_state != PackageManager.PERMISSION_GRANTED) {
listPermissionsNeeded.add(permission.CHANGE_WIFI_STATE);
}
if (loc2 != PackageManager.PERMISSION_GRANTED) {
listPermissionsNeeded.add(android.Manifest.permission.ACCESS_FINE_LOCATION);
}
if (loc != PackageManager.PERMISSION_GRANTED) {
listPermissionsNeeded.add(android.Manifest.permission.ACCESS_COARSE_LOCATION);
}
if (internet != PackageManager.PERMISSION_GRANTED) {
listPermissionsNeeded.add(permission.INTERNET);
}
if (!listPermissionsNeeded.isEmpty())
{
ActivityCompat.requestPermissions(this,listPermissionsNeeded.toArray
(new String[listPermissionsNeeded.size()]),REQUEST_ID_MULTIPLE_PERMISSIONS);
return false;
}
return true;
}
我在我的onCreate中调用了这个方法。我仍然收到控制器Wifi无法打开的调用堆栈消息,我越来越认为这是该问题。
您是否在Android Manifest中定义了接收器? –
是的,我现在试着在清单中声明接收器,但是没有任何改变。我认为唯一可能是错误的是Wifi可能没有正确启用,正如callstack所指出的那样? –
什么是您的测试设备的Android版本? –