자세한 사항은 아래 안드로이드 개발자 사이트를 링크해 놓았습니다.
https://developer.android.com/guide/topics/connectivity/wifi-scan
위 링크에 보면 설명이 나와 있지만 권한이 필요합니다.
그래서 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"?>
<androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
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"?>
<androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
android:layout_width="match_parent"
android:layout_height="60dp"
<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
|
package com.daonn.ex_wifiscan;
import android.view.LayoutInflater;
import android.net.wifi.ScanResult;
import android.view.View;
import android.view.ViewGroup;
import android.widget.TextView;
import androidx.annotation.NonNull;
import java.util.List;
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) {
View itemView = LayoutInflater.from(parent.getContext()).inflate(R.layout.recyclerview_item , parent, false);
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
|
package com.daonn.ex_wifiscan;
import androidx.annotation.NonNull;
import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import android.content.IntentFilter;
import android.net.wifi.ScanResult;
import android.os.Bundle;
import android.view.View;
import android.widget.Toast;
import java.util.List;
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를 정보를 가져와서 보여줍니다.
(회사 또는 지역 노출로 인하여 와이파이 명은 가렸습니다.)
'안드로이드 > 개발자 일상' 카테고리의 다른 글
안드로이드 Splash (로딩화면) (2) | 2020.03.27 |
---|---|
안드로이드 NetworkCallback(실시간 네트워크 체크) (3) | 2020.03.25 |
안드로이드 설정 화면 띄우기 ( 폰에 원래 있는 Setting 화면들 ) (3) | 2020.03.24 |
안드로이드 Retrofit2+RecyclerView 1-1(영화진흥위원회 오픈 API 이용) (6) | 2020.03.22 |
안드로이드 JSONObject를 List, Map으로 저장하는 팁 (14) | 2020.03.21 |
댓글