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

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

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

권한 선언의 대안

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

주변 장소 표시

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

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

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

사진 찍기

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

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

동영상 녹화

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

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

앱에서 만든 미디어 열기

앱에서는 사용자가 앱을 사용하면서 만든 미디어 콘텐츠(예: 사진이나 동영상)를 표시할 수 있습니다. 이때 앱이 Android 10 이상을 타겟팅하는 한 Android 10(API 수준 29) 이상을 실행하는 기기에서는 READ_EXTERNAL_STORAGE 권한을 사용하지 않아도 됩니다. 앱이 Android 10을 타겟팅하면 범위 지정 저장소를 선택 해제하세요.

이전 기기와의 호환성을 위해 READ_EXTERNAL_STORAGE 권한을 선언하고 android:maxSdkVersion28로 설정합니다.

미디어 저장소에 잘 알려진 다음 컬렉션 중 하나에서 파일을 찾습니다.

직접 미디어 콘텐츠를 검색하려고 하기보다는 ContentResolver를 사용하여 미디어 저장소에서 바로 미디어 콘텐츠를 쿼리합니다.

문서 열기

앱에서는 사용자가 내 앱이나 다른 앱에서 만든 문서를 표시할 수 있습니다. 일반적으로 텍스트 파일을 예로 들 수 있습니다.

이때 앱이 Android 10 이상을 타겟팅하는 한 Android 10 이상을 실행하는 기기에서는 READ_EXTERNAL_STORAGE 권한을 사용하지 않아도 됩니다. 앱이 Android 10을 타겟팅하면 범위 지정 저장소를 선택 해제하세요.

이전 기기와의 호환성을 위해 READ_EXTERNAL_STORAGE 권한을 선언하고 android:maxSdkVersion28로 설정합니다.

문서를 만든 앱에 따라 다음 중 하나를 실행하세요.

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

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

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

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

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

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

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

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

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

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

전화 필터링

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

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