0

사용 가능한 WiFi LAN을 스캔해야하는 Android 용 앱을 개발하고 있습니다.SCAN_RESULTS_AVAILABLE_ACTION : BroadcastReceiver # 안드로이드 7.0에서 onReceive가 호출되지 않았습니다.

나는 앱을 테스트하고 있으며 4.4에서 6.x까지의 Android를 사용하지만 Nougat에서는 작동합니다 (사실 Android 2와 Huawei 및 HTC 2 대를 테스트했습니다). 내 BroadcastReceiveronReceive은 절대로 호출되지 않습니다. 내가 WIFI_STATE_CHANGED_ACTION으로하려고하면

가 나는 누가의 변화 '문서를 확인했습니다 심지어 안드로이드 7.

에이 작업을 수신 할 수있어,하지만 난 이것에 대해 아무것도 찾을 수 없습니다. 누가가 누가 (Nougat)에서 왜 작동하지 않습니까? 추가/변경해야 할 항목은 무엇입니까?

다음은 내 앱을 삭제 한 버전입니다.

의 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)이 항목을 제거하면 안드로이드 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

관련 문제