2017-04-20 92 views
0

我正在開發Android應用程序,在該應用程序中我必須掃描可用的WiFi局域網。SCAN_RESULTS_AVAILABLE_ACTION:BroadcastReceiver#onReceive未在Android 7.0上調用

我測試的應用程序,它適用於從Android 4.4到6.x的設備,但在牛軋糖(事實上,我已經測試了兩種不同的設備,一個是華爲和一個HTC,帶有Android 7)我的BroadcastReceiveronReceive永遠不會被調用。

如果我嘗試用WIFI_STATE_CHANGED_ACTION我能夠接受這個動作,即使在Android 7.

我檢查的變化的牛軋糖的文檔,但我什麼也沒發現這個問題。爲什麼它不適用於牛軋糖?我必須添加/更改什麼?

這是我的應用程序的精簡版本。

AndroidManifest.xml中我說:

<uses-permission android:name="android.permission.CHANGE_WIFI_STATE" /> 
    <uses-permission android:name="android.permission.ACCESS_WIFI_STATE" /> 
    <uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" /> 

MainActivity.java

public class MainActivity extends AppCompatActivity { 
private ListView _listSSID; 
private ArrayAdapter<String> _adapter; 
private WiFiConnection _wifiConnection = null; 

@Override 
protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.activity_main); 
} 

@Override 
protected void onStart() { 
    super.onStart(); 
    _wifiConnection = new WiFiConnection(this); 
    _adapter = new ArrayAdapter<>(this, android.R.layout.simple_list_item_1, 
      android.R.id.text1, _wifiConnection.getBestSSIDs()); 
    _listSSID = (ListView) findViewById(R.id.listSSID); 
    _listSSID.setAdapter(_adapter); 
    _listSSID.setOnItemClickListener(new AdapterView.OnItemClickListener() { 
     @Override 
     public void onItemClick(AdapterView<?> parent, View view, int position, long id) { 
      String ssid = _adapter.getItem(position); 
      Log.d("OnClick", ssid); 
     } 
    }); 
    startScan(); 
} 

@Override 
protected void onStop() { 
    super.onStop(); 

    _wifiConnection.stopScan(); 
    unregisterReceiver(_wifiScanReceiver); 
} 

void startScan() { 
    checkPermission(this); 

    registerReceiver(_wifiScanReceiver, 
      new IntentFilter(WifiManager.SCAN_RESULTS_AVAILABLE_ACTION)); 
    Thread t = new Thread(_wifiConnection.getWifiScanner()); 
    t.start(); 
} 

private final BroadcastReceiver _wifiScanReceiver = new BroadcastReceiver() { 
    @Override 
    public void onReceive(Context c, Intent intent) { 
     if (intent.getAction().equals(WifiManager.SCAN_RESULTS_AVAILABLE_ACTION)) { 
      if (_wifiConnection != null && _wifiConnection.isWifiEnabled()) { 
       _wifiConnection.updateScanData("No WLANs found"); 
      } 
      _adapter.notifyDataSetChanged(); 
     } 
    } 
}; 

static final int MY_PERMISSIONS_REQUEST = 1042; 

private static final String PERMISSIONS_TAG = "PERMISSION"; 

@TargetApi(Build.VERSION_CODES.M) 
public static boolean checkPermission(Activity activity) { 
    boolean permission = true; 
    if (android.os.Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) { 
     permission = activity.checkSelfPermission(Manifest.permission.ACCESS_WIFI_STATE) == PackageManager.PERMISSION_GRANTED; 
     Log.d(PERMISSIONS_TAG, "ACCESS_WIFI_STATE: " + permission); 
     permission = activity.checkSelfPermission(Manifest.permission.CHANGE_WIFI_STATE) == PackageManager.PERMISSION_GRANTED; 
     Log.d(PERMISSIONS_TAG, "CHANGE_WIFI_STATE: " + permission); 
     permission = activity.checkSelfPermission(Manifest.permission.CHANGE_WIFI_MULTICAST_STATE) == PackageManager.PERMISSION_GRANTED; 
     Log.d(PERMISSIONS_TAG, "CHANGE_WIFI_MULTICAST_STATE: " + permission); 

     List<String> requiringList = new ArrayList<>(); 
     permission = activity.checkSelfPermission(Manifest.permission.WRITE_EXTERNAL_STORAGE) == PackageManager.PERMISSION_GRANTED; 
     Log.d(PERMISSIONS_TAG, "WRITE_EXTERNAL_STORAGE: " + permission); 
     if (!permission) { 
      requiringList.add(Manifest.permission.WRITE_EXTERNAL_STORAGE); 
     } 

     permission = activity.checkSelfPermission(Manifest.permission.ACCESS_COARSE_LOCATION) == PackageManager.PERMISSION_GRANTED; 
     Log.d(PERMISSIONS_TAG, "ACCESS_COARSE_LOCATION: " + permission); 
     if (!permission) { 
      requiringList.add(Manifest.permission.ACCESS_COARSE_LOCATION); 
     } 

     if (requiringList.size() > 0) { 
      String[] stringArray = requiringList.toArray(new String[0]); 
      activity.requestPermissions(stringArray, MY_PERMISSIONS_REQUEST); 
     } 
    } 
    return permission; 
} 
} 

WiFiConnection.java

class WiFiConnection 
{ 
    private static final int SCAN_INTERVAL = 1200; 

    final private List<String> _bestSSIDs = new ArrayList<>(); 

    private WifiManager _wifiManager; 

    private final WiFiScanner _startScan = new WiFiScanner(); 

    WiFiConnection(Activity activity) { 
     _wifiManager = (WifiManager) activity.getApplicationContext().getSystemService(Context.WIFI_SERVICE); 
    } 

    List<String> getBestSSIDs() {return _bestSSIDs; } 
    WiFiScanner getWifiScanner() { return _startScan; } 
    void stopScan() { _startScan.stop(); } 

    boolean isWifiEnabled() { return _wifiManager.isWifiEnabled(); } 

    void updateScanData(final String noLansMsg) { 
     if ((_wifiManager != null && _wifiManager.isWifiEnabled())) { 
      List<ScanResult> scanResults = _wifiManager.getScanResults(); 
      Log.d("WiFi", "found nets: " + scanResults.size()); 

      // my sorting code 
     } 
    } 

    private class WiFiScanner implements Runnable 
    { 
     private boolean _stop = false; 
     public void stop() {_stop = true;} 
     @Override 
     public void run() { 
      while (!_stop) { 
       _wifiManager.startScan(); 
       try { 
        Thread.sleep(SCAN_INTERVAL); 
       } catch (InterruptedException e) { 
        e.printStackTrace(); 
       } 
      } 
     } 
    } 
} 

回答

0

似乎有必要打開GPS在Android 7.0上接收SCAN_RESULTS_AVAILABLE_ACTION。

0

@TargetApi(Build.VERSION_CODES.M)刪除它將執行Android M只有其他明智的寫入更大或相等的M版本代碼。

if (android.os.Build.VERSION.SDK_INT >= android.os.Build.VERSION_CODES.M){ 
    // Do something for M and above versions 
} else{ 
+0

我認爲'TargetApi'註釋僅用於lint工具目的,並且在運行時沒有結果。事實上,我已經獲得了牛軋糖的許可請求。 – asclepix

相關問題