티스토리 뷰

The Way to Scan Wifi List 

내 주변의 와이파이의 목록을 가져오는 법


1. WifiManager를 선언

wifiManager = (WifiManager) getContext().getSystemService(Context.WIFI_SERVICE);


2. IntentFilter를 선언하여 Receiver를 등록

IntentFilter intentFilter = new IntentFilter(WifiManager.SCAN_RESULTS_AVAILABLE_ACTION);
intentFilter.addAction(WifiManager.NETWORK_STATE_CHANGED_ACTION);
getContext().registerReceiver(receiver, intentFilter);


3. Receiver의 구성

private BroadcastReceiver receiver = new BroadcastReceiver() {
@Override
public void onReceive(Context context, Intent intent) {
final String action = intent.getAction();
if(action.equals(WifiManager.SCAN_RESULTS_AVAILABLE_ACTION)) {
scanDatas = wifiManager.getScanResults();
adapter.setResults(scanDatas);
}else if(action.equals(WifiManager.NETWORK_STATE_CHANGED_ACTION)) {
getContext().sendBroadcast(new Intent("wifi.ON_NETWORK_STATE_CHANGED"));
}
}
};



4. 스캔시작

wifiManager.startScan();


5. class의 종료시 receiver해제

getContext().unregisterReceiver(receiver);



추가적으로 자동으로 와이파이에 연결시키려면?

if(!wifiManager.isWifiEnabled()){
wifiManager.setWifiEnabled(true);
}



전체적인 구성도 

public class WifiScanFragment extends Fragment {

@Bind(R.id.widget_recyclerview) RecyclerView recyclerView;

private WifiScanAdapter adapter;
private WifiManager wifiManager;
private List<ScanResult> scanDatas; // ScanResult List

private BroadcastReceiver receiver = new BroadcastReceiver() {
@Override
public void onReceive(Context context, Intent intent) {
final String action = intent.getAction();
if(action.equals(WifiManager.SCAN_RESULTS_AVAILABLE_ACTION)) {
scanDatas = wifiManager.getScanResults();
adapter.setResults(scanDatas);
}else if(action.equals(WifiManager.NETWORK_STATE_CHANGED_ACTION)) {
getContext().sendBroadcast(new Intent("wifi.ON_NETWORK_STATE_CHANGED"));
}
}
};

@Override
public void onCreate(@Nullable Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
wifiManager = (WifiManager) getContext().getSystemService(Context.WIFI_SERVICE);
if(!wifiManager.isWifiEnabled()){
wifiManager.setWifiEnabled(true);
}
}

@Nullable
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
View view = inflater.inflate(R.layout.fragment_wifi_scan, container, false);
ButterKnife.bind(this, view);

adapter = new WifiScanAdapter(getActivity());
recyclerView.setHasFixedSize(true);
recyclerView.setLayoutManager(new LinearLayoutManager(getActivity()));
recyclerView.setItemAnimator(new DefaultItemAnimator());
recyclerView.setAdapter(adapter);
return view;
}

@Override
public void onResume() {
super.onResume();
IntentFilter intentFilter = new IntentFilter(WifiManager.SCAN_RESULTS_AVAILABLE_ACTION);
intentFilter.addAction(WifiManager.NETWORK_STATE_CHANGED_ACTION);
getContext().registerReceiver(receiver, intentFilter);
wifiManager.startScan();
}

@Override
public void onPause() {
super.onPause();
getContext().unregisterReceiver(receiver);
}
}



마지막으로 rxjava를 이용한 라이브러리도 있다.


https://github.com/pwittchen/ReactiveNetwork



댓글
  • 프로필사진 2017.07.29 17:37 신고
  • 프로필사진 비밀댓글입니다 2017.07.29 17:38
  • 프로필사진 lovelycbm 아카이님 안녕하세요 올려주신 코드 덕분에 수월하게 와이파이 리스트 관련 기능 구현 할 수 있었습니다.

    댓글을 남기는건 다름이 아니오라 지금 제가 굉장히 특이한 증상이 발생해서 혹시 비슷한 문제가 생겼거나 해결 하신적이 있으신지 궁금하여
    염치불구하고 댓글 남기게 되었습니다.

    현재 저는 올려주신 형태대로 구현하여 리스트 뷰 상에 와이파이 목록이 정확하게 뜨고 있습니다.

    문제는 특정기기에서 와이파이 리스트 목록값이 아예 아무것도 나오지 않는 현상이 발생중입니다.

    굉장히 희안한게 가령 같은 s7이어도 어떤 기기는 되고 어떤기기는 안되고 합니다. (안드로이드 버전문제인가 싶어 전부 업데이트를 해보았지만 소용이 없었습니다.) 권한문제인가 싶어 권한부분도 전부 체크 해보았는데 특별한 문제가 없습니다.

    특이사항이라고 하면 mainactivity 부분에서 wifiList와 scanDatas값을 출력할 경우 안되는 기기에서는 값이 아무것도 없이 나오는점일 것 같습니다.

    혹시 위와 비슷한 문제가 발생하여 해결하셨던 적이 있으시면 도움 부탁 드려도 될런지요?

    2018.01.05 17:49 신고
  • 프로필사진 장규민 안녕하세요 안드로이드 스튜디오에서 wifi 스캔 이 특정 기기만 되는 현상을 해결 하셨습니까?
    만약 해결 하셨으면 어떻게 해결 하셨습니까? 저좀 도와 주세요우ㅠㅜ
    2018.08.08 16:34 신고
  • 프로필사진 비밀댓글입니다 2018.11.12 23:44
댓글쓰기 폼