앱에서 권한을 선언해야 하는지 평가하기

앱에서 권한을 선언하기 전에 필요성을 고려하세요. 사용자가 런타임 권한이 필요한 앱 기능을 사용하려고 할 때마다 앱에서 권한 요청을 위해 사용자의 작업을 중단해야 합니다. 그러면 사용자는 결정을 내려야 합니다. 사용자가 앱에서 특정 권한을 요청하는 이유를 이해하지 못한다면 권한을 거부하거나 앱을 제거할 수도 있습니다.

설치된 다른 앱이 내 앱을 대신하여 기능을 실행할 수 있는지도 고려해야 합니다. 이러한 경우에는 인텐트를 사용하여 다른 앱에 작업을 위임해야 합니다. 이렇게 하면 다른 앱에서 권한을 대신 선언하므로 내 앱에서는 필요한 권한을 선언할 필요가 없습니다.

권한 선언의 대안

이 섹션에서는 앱이 필요한 권한을 선언하지 않고도 처리할 수 있는 몇 가지 사용 사례를 설명합니다.

주변 장소 표시

앱에서 사용자의 대략적인 위치를 알아야 할 수 있습니다. 이는 근처 음식점과 같은 위치 인식 정보를 표시하는 데 유용합니다.

사용 사례에 따라 기기 위치의 대략적인 추정치가 약 2km 이내여야 할 때가 있습니다. 이러한 상황에서는 ACCESS_COARSE_LOCATION 권한을 선언할 수 있지만, 권한을 선언하는 대신 사용자에게 주소나 우편번호를 입력하도록 요청하세요.

다른 사용 사례에서는 기기 위치의 더 정확한 추정치가 필요하기도 합니다. 이러한 상황에서만 ACCESS_FINE_LOCATION 권한을 선언하시기 바랍니다.

사진 찍기

사용자는 사전 설치된 시스템 카메라 앱을 사용하여 앱에서 사진을 찍을 수 있습니다.

이러한 상황에서는 CAMERA 권한을 선언하지 마세요. 대신 ACTION_IMAGE_CAPTURE 인텐트 작업을 호출하세요.

동영상 녹화

사용자는 사전 설치된 시스템 카메라 앱을 사용하여 앱에서 동영상을 녹화할 수 있습니다.

이러한 상황에서는 CAMERA 권한을 선언하지 마세요. 대신 ACTION_VIDEO_CAPTURE 인텐트 작업을 호출하세요.

다른 앱의 미디어 또는 문서 열기

앱에서 사진, 동영상, 텍스트 파일 등 다른 앱에서 만든 콘텐츠를 표시할 수 있습니다.

이러한 상황에서는 READ_EXTERNAL_STORAGE 권한을 선언하지 마세요. 또한 Android 10(API 수준 29)부터 지원 중단된 getExternalStorageDirectory()와 같은 메서드를 사용하여 공유 또는 외부 저장소 기기에 직접 액세스하지 않아야 합니다. 대신 기기의 미디어 저장소를 사용하여 미디어 파일을 열고 저장소 액세스 프레임워크를 사용하여 문서 및 기타 파일을 여세요.

앱의 인스턴스를 실행 중인 기기 식별

앱의 특정 인스턴스에서 실행 중인 기기를 파악해야 할 수 있습니다. 이는 TV 기기 및 웨어러블 기기의 재생목록이 다른 경우와 같이 기기별 환경설정이나 메시지 기능이 있는 앱에 유용합니다.

이러한 상황에서는 기기의 IMEI에 직접 액세스하지 마세요. 실제로 Android 10(API 수준 29)부터는 직접 액세스할 수 없습니다. 대신 다음 중 하나를 따르세요.

  • 인스턴스 ID 라이브러리를 사용하여 앱 인스턴스의 고유한 기기 식별자를 가져옵니다.
  • 범위가 앱 저장소로 지정되는 자체 식별자를 만듭니다. randomUUID()와 같은 기본 시스템 함수를 사용하세요.

블루투스를 통해 기기와 페어링

앱에서 블루투스를 통해 다른 기기로 데이터를 전송하여 향상된 환경을 제공할 수 있습니다.

이 기능을 지원하려면 ACCESS_FINE_LOCATION, ACCESS_COARSE_LOCATIION 또는 BLUETOOTH_ADMIN 권한을 선언하는 대신 호환 기기 페어링을 사용하세요.

앱이 중단될 때 미디어 일시중지

사용자가 전화를 받거나 사용자가 설정한 알람이 실행되는 경우 앱에서 오디오 포커스를 다시 획득할 때까지 앱의 미디어 재생을 일시중지해야 합니다.

이 기능을 지원하려면 READ_PHONE_STATE 권한을 선언하는 대신 시스템에서 오디오 포커스를 이동할 때 자동으로 실행되는 onAudioFocusChange() 이벤트 핸들러를 구현하세요. 오디오 포커스를 구현하는 방법을 자세히 알아보세요.

전화 필터링

사용자 환경이 불필요하게 중단되는 상황을 최소화하기 위해 앱에서 스팸 전화를 필터링할 수 있습니다.

이 기능을 지원하려면 READ_PHONE_STATE 권한을 선언하는 대신 CallScreeningService API를 사용하세요.