Android 롤리팝까지 잘 사용하던 BLE 및 Wi-Fi SW가 갑자기 동작하지 않기 시작했습니다.

 

BLE scan을 하거나 Wi-Fi Scan을 했을 때, Callback은 잘 되더라도 결과가 올라오지 않는 문제가 있습니다.

 

logcat으로 출력로그를 면밀히 살펴보면 뭔가 권한 이슈가 생겼음을 짐작할 수 있습니다.

 

맞습니다.

 

마시멜로로 오면서 권한 체크가 강화되면서 run time에 user로부터 권한을 받는 절차를 추가로 받아야 합니다.

 

다음의 링크를 보시면 쉽게 이해할 수 있을 겁니다.

빨리 수정을 하고 싶으시다면 2,3번의 코드를 Activity Class를 사용하는 곳에 넣으시면 BLE, Wi-Fi Scan 이 잘되는 것을 보실 수 있을겁니다.

 

 

 

1. 아래 내용에 대한 Ref :  https://developer.android.com/intl/ko/training/permissions/declaring.html

                        https://developer.android.com/intl/ko/training/permissions/requesting.html

          

 

2. Permissions in AndroidManifest file

<manifest xmlns:android="http://schemas.android.com/apk/res/android"
       
package="com.example.snazzyapp">

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

   
<application ...>
        ...
   
</application>

</manifest>

ACCESS_COARSE_LOCATION 대신 ACCESS_FINE_LOCATION 을 사용해도 무방합니다.

 

3. Code Snippet

3.1 권한을 갖고 있는지 점검하는 코드

// Assume thisActivity is the current activity
int permissionCheck = ContextCompat.checkSelfPermission(thisActivity,
       
Manifest.permission.ACCESS_COARSE_LOCATION);

PackageManager.PERMISSION_GRANTED : 권한 갖고 있으니 scan 이 실패하지 않음

PERMISSION_DENIED : 권한이 현재 없으니 사용자로부터 권한을 획득해야 함.

 

3.2 권한을 갖고 있지 않다면 요청하는 코드

 

// No explanation needed, we can request the permission.

       
ActivityCompat.requestPermissions(thisActivity,
               
new String[]{Manifest.permission.ACCESS_COARSE_LOCATION},
                MY_PERMISSIONS_REQUEST_READ_CONTACTS
);

       
// MY_PERMISSIONS_REQUEST_READ_CONTACTS is an
       
// app-defined int constant. The callback method gets the
       
// result of the request.

※ MY_PERMISSIONS_REQUEST_READ_CONTACTS 값은 추후 onRequestPermissionsResult(...) 가 호출될 때 requestCode값입니다.

    다음의 코드를 참조하시면 됩니다.

 

3.3 권한요청에 대한 사용자의 응답 결과 처리

@Override
public void onRequestPermissionsResult(int requestCode,
       
String permissions[], int[] grantResults) {
   
switch (requestCode) {
       
case MY_PERMISSIONS_REQUEST_READ_CONTACTS: {
           
// If request is cancelled, the result arrays are empty.
           
if (grantResults.length > 0
               
&& grantResults[0] == PackageManager.PERMISSION_GRANTED) {

               
// permission was granted, yay! Do the
               
// contacts-related task you need to do.

           
} else {

               
// permission denied, boo! Disable the
               
// functionality that depends on this permission.
           
}
           
return;
       
}

       
// other 'case' lines to check for other
       
// permissions this app might request
   
}
}

 

참고로 1번의 링크에서는 SMS 나 WRITE_CALENDAR 권한을 통해 설명하고 있습니다.

여기에서는 Wi-Fi 등에 대한 권한이 필요하므로 ACCESS_COARSE_LOCATION이 사용되었습니다.