2017-08-09 66 views
0

通過在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無法打開的調用堆棧消息,我越來越認爲這是該問題。

+0

您是否在Android Manifest中定義了接收器? –

+0

是的,我現在試着在清單中聲明接收器,但是沒有任何改變。我認爲唯一可能是錯誤的是Wifi可能沒有正確啓用,正如callstack所指出的那樣? –

+0

什麼是您的測試設備的Android版本? –

回答

0

這個問題是我的錯誤,我使用的是android emulat或者在我應該使用實際的手機時測試我的應用程序。

相關問題