기본 콘텐츠로 건너뛰기

8월, 2017의 게시물 표시

Android : WifiManager 의 getScanResults()의 반환값이 계속 비어서 반환될때

요즘 Wifi 접속을 간편하게 할 수 있는 Util 을 구상중인데 예상치못한 부분에서 문제가 생겨 한동안 삽질 했다. 계속해서 getScanResults()의 반환값이 empty list가 되는 문제였는데permission에 문제도 없는 코드에서 왜 자꾸 empty list가 반환되는지 오랫동안 구글링 해본 결과 그 이유를 알아내었다. 안드로이드 API 23 (6.0.1) 또는 android.M 부터는 run-time에 permission을 require한다고 한다. 그래서 이 API 버전부터는 permission이 앱을 설치할 때 부여되는 것이 아니라 runtime에 부여가 되며 코딩도 그러한 방식으로 해야한다. 그러나 여기서 많은 제약이 생겨버린다. runtime으로 권한을 요청받으려면 내가 만들려던 WifiUtil을 Fragment나 Activity로 선언해야한다는 것이다. 이는 Util을 쓰나마나한 복잡한 사태를 만들어 버려서 runtime 으로 권한을 요청하는 것을 포기하였다. 그래서 이러한 방법을 사용하였다. 구글 개발자 문서에 따르면 Target SDK 버전이 23보다 낮으면 디바이스의 플랫폼 버전이 23이상이어도 앱 설치시에 권한을 부여한다는 것이다. 그러나 여전히 android 6.0이상의 디바이스에서 설치 후에 앱권한을 취소하고도 실행할 수 있으니 주의해야 한다. 해당 구글 개발자 문서 링크 : https://developer.android.com/training/permissions/requesting.html?hl=ko