이번 편의 목표: targetSdk 37 앱이 같은 망의 기기에 접속할 때 ACCESS_LOCAL_NETWORK를 선언하고 실행 중에 요청합니다.
안드로이드 16에서는 로컬 네트워크 권한을 선택적으로 켤 수 있었습니다. targetSdk 37부터는 강제입니다. 스마트 홈 기기나 캐스팅 수신기처럼 LAN의 다른 기기에 직접 접속하려면 새 런타임 권한 ACCESS_LOCAL_NETWORK가 있거나, 시스템이 중간에서 기기를 고르게 하는 선택 화면을 써야 합니다. 선택 화면을 쓰면 권한 대화상자를 생략할 수 있습니다.
이 권한은 기존 NEARBY_DEVICES 그룹에 속합니다. 사용자가 그 그룹의 다른 권한을 이미 허용했다면 다시 묻지 않습니다.
매니페스트에 선언합니다.
<uses-permission android:name="android.permission.ACCESS_LOCAL_NETWORK" />실행 중 요청은 다른 위험 권한과 같은 계약입니다.
val requestLocalNetwork = registerForActivityResult(
ActivityResultContracts.RequestPermission()
) { granted ->
if (granted) {
connectToShelfReader()
}
}
fun askLocalNetwork() {
requestLocalNetwork.launch(Manifest.permission.ACCESS_LOCAL_NETWORK)
}권한이 거절된 상태에서 소켓을 열면 접속은 실패합니다. 권한이 필요한 화면에서만 요청하고, 거절되면 같은 망 기능을 숨깁니다.
프로필을 넘는 루프백은 타깃과 관계없이 안드로이드 17에서 기본으로 막힙니다. 같은 프로필 안의 루프백은 그대로입니다. 업무 프로필과 개인 프로필 사이에서 127.0.0.1로 데이터를 주고받던 앱은 이 경로를 더 이상 쓰지 못합니다.
직접 해 보기
LAN 접속이 없는 앱이라면 매니페스트에 이 권한을 넣지 마세요. 접속이 있는 앱은 권한을 거절한 상태에서 기기를 찾지 못하는 화면이 나는지 확인하세요.
해설
권한 문자열은 선언과 요청이 같아야 합니다. 선언만 하고 요청하지 않으면 위험 권한은 허용되지 않습니다. 시스템 기기 선택 화면으로 바꾼 경우에는 이 권한 요청 자체가 필요 없습니다.
COMMENTS
댓글 0
이 글에 대한 의견이나 질문을 남겨 주세요.
댓글은 구글이나 카카오로 시작한 뒤에 남길 수 있습니다.
등록된 댓글이 없습니다.