공부하는 다락방

Android 10(target SDK 29) does not meet the requirements to access device identifiers. 본문

Android

Android 10(target SDK 29) does not meet the requirements to access device identifiers.

권파인 2020. 3. 13. 17:20

테스트를 진행하다가 앱이 인트로 진입도 못하고 바로 강종현상 발생이 됐다.

로그를 보아하니 The user 10983 does not meet the requirements to access device identifiers. 에러가 발생

구글링을 해보니 targetSDK 29부터 Build나 TelephonyManager 클래스를 통해 제공되는 이 기능이 개인정보 보호 강화 정책에 따라 추가 제약을 받는다고 한다. 가이드 참고

 

Android 10의 개인정보 보호 변경사항  |  Android 개발자  |  Android Developers

Android 10(API 레벨 29)에는 사용자의 개인정보 보호 강화를 위해 많은 기능과 동작 변경사항이 도입되었습니다. 따라서 사용자가 앱에 제공하는 데이터와 기능을 더욱 투명하고 세밀하게 제어할 수 있습니다. 이에 따라 앱이 의존하는 특정 동작이나 데이터가 이전 버전의 플랫폼과 다르게 작동할 수도 있습니다. 앱이 사용자 데이터 처리에 관한 최신 권장사항을 따르는 경우에는 앱에 미치는 영향이 최소화됩니다. 이 페이지에는 각 변경사항이 요약되어 있습니다

developer.android.com

 

현재 운영하고있는 앱에서는 UUID를 체크하는 로직이 필요한데 해당 이슈때문에 대체하는 코드를 찾게되었다.

 /**
     * UUID를 가져온다
     * @param mContext
     * @return
     */
    public static String getDevicesUUID(Context mContext){
        String tmDevice = null, tmSerial = null, androidId;
        UUID deviceUuid;

        if (android.os.Build.VERSION.SDK_INT >= Build.VERSION_CODES.Q) {
            deviceUuid = UUID.randomUUID(); // UUID 대체코드
        } else {
            // 기존 UUID 로직
            TelephonyManager tm = (TelephonyManager) mContext.getSystemService(Context.TELEPHONY_SERVICE);
            tmDevice = "" + tm.getDeviceId();
            tmSerial = "" + tm.getSimSerialNumber();
            
            androidId = "" + android.provider.Settings.Secure.getString(mContext.getContentResolver(), android.provider.Settings.Secure.ANDROID_ID);
            deviceUuid = new UUID(androidId.hashCode(), ((long)tmDevice.hashCode() << 32) | tmSerial.hashCode());
        }

        String deviceId = deviceUuid.toString();

        return deviceId;
    }

 

코드에 보이듯이 UUID.randomUUID(); 를 사용해서 UUID를 가져오도록 코드를 수정했다.

해당 UUID가져오는 방식이 구글에서 권장하는 방식이어서 저렇게 가져오도록 했는데, 우리 앱에서는 단말 중복여부를 체크해서 개수를 제한하는 프로세스이기 때문에 해당방식으로 가져오게 되면 앱을 삭제하고 재설치했을 때, 혹은 데이터 삭제했을때 UUID값이 리셋되어버린다.

그래서 WidevineID를 가져오는 방식으로 수정했다. 아래 코드 참조 [Widevine ID 와 MediaDrm 의 설명]

/**
     * UUID를 가져온다
     * @param mContext
     * @return
     */
    public static String getDevicesUUID(Context mContext) {
        String tmDevice = null, tmSerial = null, androidId;
        UUID deviceUuid;
        String deviceId = null;

        if (android.os.Build.VERSION.SDK_INT >= Build.VERSION_CODES.Q) { // Q(29)이상일 때 UUID가져오는 방식
            deviceUuid = new UUID(-0x121074568629b532L, -0x5c37d8232ae2de13L);
            try {
                // DRM - WIDEVINE_UUID(앱 삭제 or 데이터 삭제해도 변경x)
                MediaDrm mediaDrm = new MediaDrm(deviceUuid);
                deviceId = android.util.Base64.encodeToString(mediaDrm.getPropertyByteArray(MediaDrm.PROPERTY_DEVICE_UNIQUE_ID), 0).trim();

            } catch (UnsupportedSchemeException e) {
                e.printStackTrace();
            }
        } else { // 기존 UUID 조합해서 사용하는 방식
            if (ContextCompat.checkSelfPermission(EBookCaseApplication.Instance().getApplicationContext(), Manifest.permission.READ_PHONE_STATE) == PackageManager.PERMISSION_GRANTED) {
                TelephonyManager tm = (TelephonyManager) EBookCaseApplication.Instance().getApplicationContext().getSystemService(Context.TELEPHONY_SERVICE);
                tmDevice = "" + tm.getDeviceId();
                tmSerial = "" + tm.getSimSerialNumber();
                androidId = "" + Settings.Secure.getString(EBookCaseApplication.Instance().getApplicationContext().getContentResolver(), Settings.Secure.ANDROID_ID);

                deviceUuid = new UUID(androidId.hashCode(), ((long)tmDevice.hashCode() << 32) | tmSerial.hashCode());
                deviceId = deviceUuid.toString();
            }
        }

        return deviceId;
    }

 

 

더 자세한 내용 관련해서는 아래 링크 참조

 

[참조]

'Android' 카테고리의 다른 글

Opacity 투명도 Hex값  (0) 2022.03.17
[Kotlin] BottomNavigation With Lottie  (0) 2022.03.17
retrieveExplicitStyle NullPointerException Android 10  (0) 2020.03.12
.aab to .apk 변환  (0) 2020.03.09
알림채널(Notification Channel)  (0) 2018.09.07
Comments