안드로이드 개발/모의위치(GPS)

안드로이드 14 기기 LocationManager 의 setTestProviderEnabled 호출시 오류

Aiden96 2025. 5. 28. 14:41

결론: 안드로이드 14에서 LocationManager 의 removeTestProvider,setTestProviderEnabled 함수를 사용못하게 막아놨기 때문에 사용불가하다.사용해도 "java.lang.IllegalArgumentException: gps provider is not a test provider" 오류가 발생한다.


FusedLocationProviderClient 의 fusedClient.setMockMode(false) 호출만으로도 충분히 모의위치 주입 해제가 된다.
구글지도앱을 실행해도 실제 위치로 이동한것을 볼수 있다.

   // 100% 오류 발생
  addedProviders.forEach { provider ->
            try {
                locationManager.setTestProviderEnabled(provider, false)
            } catch (e: Exception) {
                Log.e(TEST, "setTestProviderEnabled 실패 - $provider", e)
            }
            try {
                locationManager.removeTestProvider(provider)
                Log.e(TAG, "테스트 프로바이더 해제 성공: $provider")
            } catch (e: Exception) {
                Log.e(TEST, "removeTestProvider 실패 - $provider", e)
            }
        }

removeTestProvider에서 IllegalArgumentException: gps provider is not a test provider
오류가 반복된다면,
이건 안드로이드 시스템(OS) 정책/제약 때문이고,
개발자가 우회하거나 완벽하게 해결할 수 없는 구조입니다.


🔴 왜 계속 실패하는가?

  1. 실제 단말기(Android 12 이상)에서는
    • "gps" / "network" 같은 기본 시스템 프로바이더
    • addTestProvider/removeTestProvider를 공식적으로 금지했습니다.
    • 내부적으로 add가 무시되거나, remove 시 항상 “is not a test provider” 예외 발생.
  2. 등록이 실제로 안 됐으니 해제도 항상 실패
    • try/catch로 무시해도 OS는 제거를 안 해줍니다.
    • 코드가 아니라 OS 보안정책의 문제입니다.
  3. 특정 제조사/펌웨어에서 더 엄격하게 차단
    • 심지어 에뮬레이터에서는 잘 되지만, 실기기는 막힙니다.

개발자가 할 수 있는 조치

  1. 실패시 반드시 안내문구/경고 노출
    • “이 기기에서는 시스템 정책상 모의위치 해제가 완전히 되지 않을 수 있습니다.
      문제가 계속된다면 기기 재부팅을 권장합니다.”
  2. 예외 발생을 앱이 감지하여,
    • 문제가 생길 때는 앱 동작을 즉시 중단/차단하고,
    • 사용자에게 “지원되지 않는 환경”임을 명확히 알릴 것
  3. FusedLocationProviderClient만으로도 실제 위치가 복구되는지
    (구글 지도, 테슬라 앱 등) 반드시 실험
    • 대부분의 경우 Fused의 모의 모드 해제만으로
      위치가 정상으로 돌아오며,
      테슬라 앱도 실제 위치를 받게 됩니다.

🚫 정리 – 현실적인 결론

  • 계속 동일 오류가 나는 건 개발자 잘못이 아님
  • OS가 공식적으로 차단하고 있어 실제 기기에서는 완벽히 불가능
  • 등록/해제 실패시 사용자에게 기기 재부팅 안내 및 주의 문구를 보여주는 것
    최선의 방법입니다.

📢 실제 사용자 안내 예시

 
Toast.makeText( this, "일부 단말기에서는 시스템 정책상 모의위치 해제가
완전히 지원되지 않습니다. 문제가 지속될 경우 기기 재부팅을 권장합니다.", Toast.LENGTH_LONG ).show()
 
 

또는 AlertDialog.Builder(context)

.setTitle("모의 위치 해제 실패")

.setMessage("이 기기는 시스템 정책상 모의위치 해제가 완전히 되지 않을 수 있습니다. 문제가 지속되면 기기를 재부팅해 주세요.").setPositiveButton("확인", null) .show()


📚 참고 공식 문서


요약

  • 실기기, 최신 OS에서 LocationManager의 removeTestProvider는 금지되어 오류가 필연적
  • FusedLocationProviderClient만 사용하고, 실패시 안내 메시지로 대처
  • 완벽한 해제가 필요한 앱(테슬라 등)에서는 사용자 안내 및 기기 재부팅 권장

이건 정말 "OS 정책 이슈"라 더이상 해결법이 없습니다.