일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | |||||
3 | 4 | 5 | 6 | 7 | 8 | 9 |
10 | 11 | 12 | 13 | 14 | 15 | 16 |
17 | 18 | 19 | 20 | 21 | 22 | 23 |
24 | 25 | 26 | 27 | 28 | 29 | 30 |
Tags
- Bluetooth 스캔
- retrieveExplicitStyle
- Android OS 10
- 바텀네비
- aab파일apk변환
- 안드로이드 디버깅툴
- lottieAnimation
- 앱강종
- bottomNavigation animation
- 안드로이드aab변환
- 안드로이드
- Opacity Hex
- BottomNavigation
- 바텀네비게이션
- 앱강종현상
- 로그캣 색상변경
- targetSDK29
- apk변환
- Android Bluetooth
- 고유식별자
- 안드로이드apk변환
- target29
- Android
- 안드로이드 로그캣
- 로띠애니메이션
- 로그캣 색상지정
- Android10
- svn체크아웃
- 투명도 hex값
- 디바이스ID
Archives
- Today
- Total
공부하는 다락방
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 클래스를 통해 제공되는 이 기능이 개인정보 보호 강화 정책에 따라 추가 제약을 받는다고 한다. 가이드 참고
현재 운영하고있는 앱에서는 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;
}
더 자세한 내용 관련해서는 아래 링크 참조
[참조]
- https://en.wikipedia.org/wiki/Unique_identifier
- https://developer.android.com/about/versions/10/privacy/changes#non-resettable-device-ids
- https://stackoverflow.com/questions/55173823/i-am-getting-imei-null-in-android-q
- https://android.googlesource.com/platform/frameworks/base/+/master/core/res/AndroidManifest.xml#2067
- http://sunphiz.me/wp/archives/3332
- https://developer.android.com/about/versions/10/privacy/changes#data-ids
- https://developer.android.com/training/permissions/usage-notes#d_create_a_unique_identifier_for_advertising_or_user_analytics
- https://developer.android.com/training/articles/user-data-ids#java
- http://sunphiz.me/wp/archives/3426
'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