권한 요청 최소화

컬렉션을 사용해 정리하기 내 환경설정을 기준으로 콘텐츠를 저장하고 분류하세요.

앱에서 권한을 선언하기 전에 꼭 필요한지 다시 한번 생각해 보세요. 권한을 선언하면 런타임 권한이 필요한 앱 기능을 사용자가 사용하려고 할 때마다 권한 요청을 위해 앱에서 사용자의 작업을 중단해야 합니다. 그렇게 되면 사용자의 판단에 모든 것이 맡겨야 합니다. 앱에서 특정 권한을 요청하는 이유를 모르면 사용자는 권한을 거부하거나 앱을 제거할 수도 있습니다.

또한 새로운 권한을 선언할 때마다 앱에서 사용자 데이터를 요청하고 공유하는 방식을 검토해야 합니다. 일부 특히 민감한 권한과 API를 사용하려면 데이터 액세스, 수집, 사용 및 공유에 관한 인앱 정보를 공개해야 합니다.

정말 권한이 필요한 건지 아니면 앱 기능을 지원할 수 있는 다른 방법이 있는 건 아닌지 생각해 보세요. 시스템은 다양한 파일 작업에 관한 기본 계약을 제공하고 맞춤 계약도 지원합니다.

권한을 반드시 선언해야 하는 경우 항상 사용자의 결정을 존중하고 앱 환경을 단계적으로 저하하는 방법을 제공해야 합니다.

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

주변 장소 표시

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

사용 사례에 따라 기기 위치의 대략적인 추정치만 필요한 경우도 있습니다. 이러한 상황에서는 앱에 위치 인식 정보가 필요한 빈도에 따라 다음 중 하나를 진행하세요.

  • 앱에 위치 정보가 자주 필요한 경우 ACCESS_COARSE_LOCATION 권한을 선언합니다. 이 권한은 대략적인 위치 정확성에 관한 문서에 설명된 대로 위치 서비스에서 기기 위치 추정치를 제공합니다.
  • 앱에 위치 정보가 자주 필요하지 않거나 한 번만 필요한 경우 사용자에게 주소나 우편번호를 대신 입력하도록 요청하는 것이 좋습니다.

다른 사용 사례에서는 기기 위치의 더 정확한 추정치가 필요하기도 합니다. 이러한 상황은 ACCESS_FINE_LOCATION 권한을 선언해도 되는 유일한 때입니다.

파일 만들기 및 액세스

Android를 사용하면 저장소나 센서와 관련된 권한을 선언하지 않고도 파일을 만들고 액세스할 수 있습니다.

사진 촬영

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

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

동영상 녹화

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

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

미디어 파일 열기

앱에서 사용자가 메시지 첨부파일 또는 프로필 사진과 같은 사진 및 동영상을 선택하도록 허용할 수 있습니다.

이 기능을 지원하려면 사진 선택 도구를 사용하세요. 사진 선택 도구 사용에는 런타임 권한이 필요하지 않습니다. 사용자가 사진 선택 도구와 상호작용하여 앱과 공유할 사진이나 동영상을 선택하면 시스템은 선택된 미디어 파일과 연결된 URI에 임시로 읽기 액세스 권한을 부여합니다.

앱이 사진 선택 도구를 사용하지 않고 미디어 파일에 액세스해야 한다면 다음과 같이 저장소 권한을 선언할 필요가 없습니다.

문서 열기

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

이러한 상황에서는 이전 기기와의 호환성을 위해서만 READ_EXTERNAL_STORAGE를 선언합니다. android:maxSdkVersion28로 설정합니다.

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

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

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

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

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

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

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

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

결제 카드 번호 자동 입력

Google Play 서비스는 결제 카드 번호를 자동으로 입력할 수 있는 라이브러리를 제공합니다. CAMERA 권한을 선언하는 대신 체크카드 및 신용카드 인식 라이브러리를 사용하면 됩니다.

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

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

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

전화 통화 및 문자 메시지 관리

Android 및 Google Play 서비스는 전화 통화 또는 SMS 메시지와 관련된 권한을 선언할 필요 없이 전화 통화 및 문자 메시지를 관리할 수 있는 라이브러리를 제공합니다.

일회용 비밀번호 자동 입력

2단계 인증 워크플로를 간소화하기 위해 앱에서 사용자의 기기로 전송되는 일회용 비밀번호를 자동으로 입력하여 신원을 확인할 수 있습니다.

Google Play 서비스에서 제공하는 기기에서 이 기능을 지원하려면 READ_SMS 권한을 선언하지 말고 대신 SMS Retriever API를 사용하세요.

다른 기기에서 앱이 Android 8.0(API 수준 26) 이상을 타겟팅한다면 createAppSpecificSmsToken()을 사용하여 앱별 토큰을 생성합니다. 인증 SMS 메시지를 전송할 수 있는 다른 앱이나 서비스로 이 토큰을 전달하세요.

사용자의 전화번호 자동 입력

더 효율적인 판매 또는 지원을 제공하기 위해 앱에서 사용자가 기기의 전화번호를 자동으로 입력하도록 허용할 수 있습니다.

Google Play 서비스에서 제공하는 기기에서 이 기능을 지원하려면 READ_PHONE_STATE 권한을 선언하지 말고 대신 Phone Number Hint 라이브러리를 사용하세요.

전화 통화 필터링

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

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

전화 걸기

앱이 연락처 정보를 탭하여 전화를 걸 수 있는 기능을 제공할 수도 있습니다.

이 기능을 지원하려면 ACTION_CALL 작업 대신 ACTION_DIAL 인텐트 작업을 사용하세요. ACTION_CALL에는 설치 시간 권한인 CALL_PHONE이 필요합니다. 이는 일부 태블릿과 같이 전화를 걸 수 없는 기기에서 애플리케이션을 설치하지 못하도록 합니다.