본문 바로가기
안드로이드/개발자 일상

안드로이드 WifiManager (내 위치 기반 와이파이 검색하기)

by 차누감 2020. 3. 24.
반응형

자세한 사항은 아래 안드로이드 개발자 사이트를 링크해 놓았습니다.

https://developer.android.com/guide/topics/connectivity/wifi-scan

 

Wi-Fi 검색 개요  |  Android 개발자  |  Android Developers

WifiManager API가 제공하는 Wi-Fi 검색 기능을 사용하여 기기에 보이는 Wi-Fi 액세스 포인트의 목록을 가져올 수 있습니다. Wi-Fi 검색 프로세스 스캔 프로세스는 세 가지 단계로 구성됩니다. SCAN_RESULTS_AVAILABLE_ACTION에 대한 Broadcast Receiver를 등록합니다. 이 수신기는 스캔 요청이 완료된 후에 호출되어 성공/실패 상태를 제공합니다. Android 10 (API 레벨 29) 이상를 실행하는 기기

developer.android.com

위 링크에 보면 설명이 나와 있지만 권한이 필요합니다.

그래서 AndroidManifest에 <uses-permission/>을 쓰고,

LOCATION 관한 permission이 있기 때문에 권한을 사용자에게 요청해야합니다.

(쉽게 AutoPermissions 라이브러리를 사하여 권한 요청, 혹시 사용법이 궁금하면 아래 링크 참조)

2020/03/17 - [안드로이드/개발자 일상] - 안드로이드 앱 권한 요청 라이브러리 AutoPermissions

 

그리고 WifiManager를 이용하여 주변 Wifi를 검색합니다.

그 정보를 RecyclerView로 보여줍니다.


<실행 화면> 버튼을 클릭하면 현재 위치에 잡히는 Wifi를 정보를 가져와서 보여줍니다.

(회사 또는 지역 노출로 인하여 와이파이 명은 가렸습니다.)


 

우선 Autopermissions, recyclerview에 관한 라이브러리를 추가하겠습니다.

Gradle:

allprojects {
  repositories {
       maven { url 'https://jitpack.io' }
  }
}
implementation 'com.github.pedroSG94:AutoPermissions:1.0.3' //autopermission
//noinspection Gradle
Compatibleimplementation 'com.android.support:recyclerview-v7:28.0.0' //recyclerview

 

권한에 관한 내용

AndroidManifest.xml

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

 

이제 화면에 보여질 activity_main.xml을 작성해 줍니다.

activity_main.xml

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
<?xml version="1.0" encoding="utf-8"?>
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    tools:context=".MainActivity">
 
        android:id="@+id/rv_recyclerview"
        android:layout_width="match_parent"
        android:layout_height="0dp"
        app:layoutManager="androidx.recyclerview.widget.LinearLayoutManager"
        android:orientation="vertical"
        app:layout_constraintBottom_toTopOf="@+id/button"
        app:layout_constraintLeft_toLeftOf="parent"
        app:layout_constraintRight_toRightOf="parent"
        app:layout_constraintTop_toTopOf="parent" />
 
    <Button
        android:id="@+id/button"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:text="WIFI SCAN"
        android:onClick="clickWifiScan"
        app:layout_constraintBottom_toBottomOf="parent"
        tools:layout_editor_absoluteX="111dp" />
 
 
 

그리고 데이터를 표현할 xml을 작성합니다.

(검색된 Wifi 이름만 표시하겠습니다.)

recyclerview_item.xml

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
<?xml version="1.0" encoding="utf-8"?>
    android:layout_width="match_parent"
    android:layout_height="60dp"
    xmlns:tools="http://schemas.android.com/tools">
 
    <TextView
        android:id="@+id/tv_wifiName"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:textSize="22sp"
        tools:text="Sample text"
        app:layout_constraintBottom_toBottomOf="parent"
        app:layout_constraintEnd_toEndOf="parent"
        app:layout_constraintHorizontal_bias="0.123"
        app:layout_constraintStart_toStartOf="parent"
        app:layout_constraintTop_toTopOf="parent"
        app:layout_constraintVertical_bias="0.609" />
 
 
 

이제 어댑터를 만들겠습니다.

 

MyAdapter.java

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
 
 
import androidx.annotation.NonNull;
 
 
 
public class MyAdapter extends RecyclerView.Adapter<MyAdapter.MyViewHolder> {
 
    private List<ScanResult> items;
 
    public MyAdapter(List<ScanResult> items){
        this.items=items;
    }
 
    @NonNull
    @Override
    public MyAdapter.MyViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
        return new MyViewHolder(itemView);
    }
 
 
    @Override
    public void onBindViewHolder(@NonNull MyViewHolder holder, int position) {
//        ScanResult item=items.get(position);
        holder.setItem(items.get(position));
    }
 
    @Override
    public int getItemCount() {
        return items.size();
    }
 
    public static class MyViewHolder extends RecyclerView.ViewHolder {
        public TextView tvWifiName;
        public MyViewHolder(View itemView) {
            super(itemView);
            tvWifiName=itemView.findViewById(R.id.tv_wifiName);
 
        }
        public void setItem(ScanResult item){
 
            tvWifiName.setText(item.SSID);
 
        }
    }
}
 
 

이제 MainActivity.java를 작성합니다.

버튼을 누렀을 시 wifi를 scan합니다. 그리고 그 정보를 recyclerview로 보여줍니다.

 

MainActivity.java

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
 
import androidx.annotation.NonNull;
 
import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.IntentFilter;
 
 
 
 
public class MainActivity extends AppCompatActivity implements AutoPermissionsListener {
 
    IntentFilter intentFilter = new IntentFilter();
    WifiManager wifiManager;
 
    private RecyclerView recyclerView;
    private RecyclerView.Adapter mAdapter;
 
 
    BroadcastReceiver wifiScanReceiver = new BroadcastReceiver() {
        @Override
        public void onReceive(Context c, Intent intent) {   // wifiManager.startScan(); 시  발동되는 메소드 ( 예제에서는 버튼을 누르면 startScan()을 했음. )
 
            boolean success = intent.getBooleanExtra(WifiManager.EXTRA_RESULTS_UPDATED, false); //스캔 성공 여부 값 반환
            if (success) {
                scanSuccess();
            } else {
                scanFailure();
            }
        }// onReceive()..
    };
 
    private void scanSuccess() {    // Wifi검색 성공
        List<ScanResult> results = wifiManager.getScanResults();
        mAdapter=new MyAdapter(results);
        recyclerView.setAdapter(mAdapter);
    }
 
    private void scanFailure() {    // Wifi검색 실패
    }
 
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
 
        recyclerView=findViewById(R.id.rv_recyclerview);
 
        //권한에 대한 자동 허가 요청 및 설명
        AutoPermissions.Companion.loadAllPermissions(this,101);
 
        //Wifi Scna 관련
        wifiManager = (WifiManager) getApplicationContext().getSystemService(Context.WIFI_SERVICE);
        intentFilter.addAction(WifiManager.SCAN_RESULTS_AVAILABLE_ACTION);
        getApplicationContext().registerReceiver(wifiScanReceiver, intentFilter);
 
 
    }// onCreate()..
 
    //버튼을 눌렀을 때
    public void clickWifiScan(View view) {  
        boolean success = wifiManager.startScan();
        if (!success) Toast.makeText(MainActivity.this"Wifi Scan에 실패하였습니다." ,Toast.LENGTH_SHORT).show();
    }// clickWifiScan()..
 
 
    //Permission에 관한 메소드
    @Override
    public void onDenied(int i, String[] strings) {Toast.makeText(this"onDenied~~", Toast.LENGTH_SHORT).show();}
 
    @Override
    public void onGranted(int i, String[] strings) {Toast.makeText(this"onGranted~~", Toast.LENGTH_SHORT).show();}
 
    @Override
    public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {
        super.onRequestPermissionsResult(requestCode, permissions, grantResults);
        AutoPermissions.Companion.parsePermissions(this, requestCode, permissions, this);
    }
    //Permission에 관한 메소드
 
 
}// MainActivity class..
 
 
 

 

<실행 화면> 버튼을 클릭하면 현재 위치에 잡히는 Wifi를 정보를 가져와서 보여줍니다.

(회사 또는 지역 노출로 인하여 와이파이 명은 가렸습니다.)

반응형

댓글