2017-04-20 21 views
0

私は使用可能なWiFi LANをスキャンする必要があるAndroid向けのアプリを開発しています。SCAN_RESULTS_AVAILABLE_ACTION:BroadcastReceiver#Android 7.0ではonReceiveが呼び出されていません

私はアプリをテストしていますが、4.4から6.xまでのAndroid搭載デバイスで動作しますが、Nougatでは(実際には2つの異なるデバイス、Huaweiと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

Android 7.0でSCAN_RESULTS_AVAILABLE_ACTIONを受信するにはGPSをオンにする必要があるようです。

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'アノテーションは糸くず用のものであり、実行時に結果がないと思います。実際、ノーガットの許可要求があります。 – asclepix

関連する問題