권한 요청 최소화

앱 품질을 개선하고 사용자 개인 정보를 보호하기 위해 앱의 권한 사용을 최소화하는 것이 좋습니다. 이를 통해 사용자는 안전하고 보안이 강화된 사용자 환경을 제공하는 고품질 앱을 찾고 사용할 수 있습니다.

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

권한 사용을 최소화하는 방법에는 여러 가지가 있습니다.

  • 앱에서 대략적인 위치만 필요한 경우 정확한 위치 정보 대신 대략적인 위치 정보를 제공하는 권한을 선언합니다.
  • 앱에서 권한을 선언하지 않고 원하는 기능을 실행할 수 있는 API를 호출합니다.
  • 권한을 선언하는 대신 특정 인텐트 또는 이벤트 핸들러를 호출하여 기능을 실행합니다.
  • 시스템은 다양한 파일 작업에 관한 기본 계약을 제공하고 맞춤 계약도 지원합니다.

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

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

주변 장소 표시

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

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

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

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

파일 만들기 및 액세스

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

미디어 파일 열기

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

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

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

문서 열기

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

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

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

사진 촬영

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

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

동영상 녹화

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

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

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

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

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

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

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

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

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

결제 카드 번호 자동 입력

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

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

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이 필요합니다. 이는 일부 태블릿과 같이 전화를 걸 수 없는 기기에서 애플리케이션을 설치하지 못하도록 합니다.

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

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

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

바코드 스캔

Android에는 Google Play 서비스에서 제공하는 Google Code Scanner API 지원 기능이 포함되어 있습니다. 이 API를 사용하면 카메라 권한을 선언하지 않고 바코드를 디코딩할 수 있습니다. 이 API는 사용자 개인 정보를 보호하는 데 도움이 되며 바코드 스캔 사용 사례를 위한 맞춤 UI를 만들 필요성을 줄여 줍니다.

API는 바코드를 스캔한 후 스캔 결과만 앱으로 반환합니다. 이미지는 기기 내에서 처리되며 Google은 어떠한 데이터나 스캔 결과도 저장하지 않습니다.

앱에서 복잡한 사용 사례 또는 바코드 형식을 지원해야 하거나 맞춤 UI가 필요한 경우 ML Kit barcode scanning API를 대신 사용하세요.

사용하지 않는 권한 재설정

Android는 사용하지 않는 런타임 권한을 기본값인 거부 상태로 재설정할 몇 가지 방법을 제공합니다.

디자인 안내를 참고하세요.

런타임 권한 요청

앱에서 런타임 권한을 선언하고 요청해야 한다고 평가했으면 특정 워크플로를 따라 그렇게 하세요.

디자인 안내를 참고하세요.

앱에 권한이 필요한 이유 설명

requestPermissions()를 사용하면 앱에서 사용하려는 권한을 나타내는 대화상자가 표시되지만 그 이유는 설명하지 않아 사용자가 혼란스러울 수 있습니다.

이 대화상자를 표시하는 방법과 시점에 관한 자세한 내용과 권장사항은 디자인 안내를 참고하세요.

권한 거부 처리

앱은 사용자가 권한 거부를 선택하기 전후에 권한 거부의 의미를 이해할 수 있도록 지원해야 합니다.

디자인 안내를 참고하세요.