사용 가능한 WiFi LAN을 스캔해야하는 Android 용 앱을 개발하고 있습니다.SCAN_RESULTS_AVAILABLE_ACTION : BroadcastReceiver # 안드로이드 7.0에서 onReceive가 호출되지 않았습니다.
나는 앱을 테스트하고 있으며 4.4에서 6.x까지의 Android를 사용하지만 Nougat에서는 작동합니다 (사실 Android 2와 Huawei 및 HTC 2 대를 테스트했습니다). 내 BroadcastReceiver
의 onReceive
은 절대로 호출되지 않습니다. 내가 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();
}
}
}
}
}
나는'TargetApi' 주석은 단지 린트 도구 목적이며 런타임에 결과가 없다고 생각합니다. 사실 누 가트에 대한 허가 요청을 받았습니다. – asclepix