안드로이드 앱 개발하면서 사용자의 핸드폰 번호, 기기 고유 id 등 정보를 많이 필요한데요. (앱 홍보 또는 여러 계정으로 앱에 가입 시 이벤트 제한 등등)
그래서 단말기 정보 가져오는 것을 알아볼 것입니다.
** 참고
Android 11에서는 앱에서 전화번호를 읽을 때 사용하는 전화 관련 권한이 변경됩니다.
앱이 Android 11 이상을 타겟팅하고 다음 목록에 표시된 전화번호 API에 액세스해야 한다면 READ_PHONE_STATE 권한 대신 READ_PHONE_NUMBERS 권한을 요청해야 합니다.
- TelephonyManager 클래스와 TelecomManager 클래스의 getLine1Number() 메서드
- TelephonyManager 클래스에서 지원되지 않는 getMsisdn() 메서드
참고 : developer.android.com/about/versions/11/privacy/permissions?hl=ko
Android 11의 권한 업데이트 | Android 개발자 | Android Developers
Android 11에서는 사용자가 위치, 마이크, 카메라에 관해 더욱 세분화된 권한을 지정할 수 있습니다. 또한 시스템은 Android 11 이상을 타겟팅하는 사용하지 않는 앱의 권한을 재설정하며 앱은 시스
developer.android.com
휴대폰 정보 가져오기
위의 참고사항처럼 우리는 Android 11 버전에 대응할 것입니다.
타겟 버전이 30인 경우 READ_PHONE_NUMBERS 권한을 요청하고, 그 이하 버전은 READ_PHONE_STATE 권한을 요청할 것입니다.
먼저 메니페스트 파일에 다음과 같이 use-permission 추가를 합니다.
<uses-permission android:name="android.permission.READ_PHONE_STATE"
android:maxSdkVersion="29" />
<uses-permission android:name="android.permission.READ_PHONE_NUMBERS" />
사용자의 안드로이드 버전에 따라 권한을 다르게 요청합니다.
권한 요청은 이전 포스팅을 활용하시면 됩니다.
develop-writing.tistory.com/39
안드로이드 런타임 퍼미션(runtime permissions)
안드로이드 앱 개발 시 TargetSDK가 마시멜로 버전(APK 23) 이상인 경우, 디바이스의 특정 기능을 사용할 때 권한을 요구하는데 그 권한 중에 위험 권한으로 분류된 권한은 개발자가 직접 사용자에게
develop-writing.tistory.com
public boolean chkPermission() {
// 위험 권한을 모두 승인했는지 여부
boolean mPermissionsGranted = false;
String[] mRequiredPermissions = new String[1];
// 사용자의 안드로이드 버전에 따라 권한을 다르게 요청합니다
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.R) {
// 11 이상인 경우
mRequiredPermissions[0] = Manifest.permission.READ_PHONE_NUMBERS;
}else{
// 10 이하인 경우
mRequiredPermissions[0] = Manifest.permission.READ_PRECISE_PHONE_STATE;
}
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
// 필수 권한을 가지고 있는지 확인한다.
mPermissionsGranted = hasPermissions(mRequiredPermissions);
// 필수 권한 중에 한 개라도 없는 경우
if (!mPermissionsGranted) {
// 권한을 요청한다.
ActivityCompat.requestPermissions(MainActivity.this, mRequiredPermissions, PERMISSIONS_REQUEST_CODE);
}
} else {
mPermissionsGranted = true;
}
return mPermissionsGranted;
}
TelephonyManager라는 클래스를 아래와 같이 Context.TELEPHONY_SERVICE를 이용하여 호출합니다.
TelephonyManager tm = (TelephonyManager)getSystemService(Context.TELEPHONY_SERVICE);
이제 TelephonyManager에서 제공하고 있는 함수들을 이용하여 원하는 데이터를 가져오면 됩니다.
전화번호는 getLine1Number()를 사용해 가져올 수 있는데 위에서 선언한 권한을 사용자에게 허가받아야 합니다.
그래서 전화번호를 가져오기 전에 권한을 요청하겠습니다.
READ_PHONE_NUMBERS 또는 READ_PHONE_STATE 권한을 사용자에게 허가 받았다면 전화 번호를 가져올 수 있습니다.
밑의 기타 정보는 권한을 허가받지 않더라도 가져올 수 있습니다.
// READ_PHONE_NUMBERS 또는 READ_PHONE_STATE 권한을 허가 받았는지 확인
if (ActivityCompat.checkSelfPermission(this, Manifest.permission.READ_PHONE_NUMBERS) != PackageManager.PERMISSION_GRANTED && ActivityCompat.checkSelfPermission(this, Manifest.permission.READ_PHONE_STATE) != PackageManager.PERMISSION_GRANTED) {
return;
}
Log.d(TAG, "음성통화 상태 : [ getCallState ] >>> " + tm.getCallState());
Log.d(TAG, "데이터통신 상태 : [ getDataState ] >>> " + tm.getDataState());
Log.d(TAG, "전화번호 : [ getLine1Number ] >>> " + tm.getLine1Number());
Log.d(TAG, "통신사 ISO 국가코드 : [ getNetworkCountryIso ] >>> "+tm.getNetworkCountryIso());
Log.d(TAG, "통신사 ISO 국가코드 : [ getSimCountryIso ] >>> "+tm.getSimCountryIso());
Log.d(TAG, "망사업자 MCC+MNC : [ getNetworkOperator ] >>> "+tm.getNetworkOperator());
Log.d(TAG, "망사업자 MCC+MNC : [ getSimOperator ] >>> "+tm.getSimOperator());
Log.d(TAG, "망사업자명 : [ getNetworkOperatorName ] >>> "+tm.getNetworkOperatorName());
Log.d(TAG, "망사업자명 : [ getSimOperatorName ] >>> "+tm.getSimOperatorName());
Log.d(TAG, "SIM 카드 상태 : [ getSimState ] >>> "+tm.getSimState());
기기 고유 id 가져오기
Secure 클래스에서 제공하는 android_id를 사용하면 됩니다.
String android_id = Settings.Secure.getString(this.getContentResolver(),Settings.Secure.ANDROID_ID);
결과 값은 다음과 같이 나옵니다.
전체 소스는 깃헙에서 확인하시면 됩니다.
github.com/keepseung/Android-Blog-Source
keepseung/Android-Blog-Source
https://develop-writing.tistory.com/ 에서 제공하는 예제. Contribute to keepseung/Android-Blog-Source development by creating an account on GitHub.
github.com
참고 : developer.android.com/reference/android/provider/Settings.Secure
Settings.Secure | Android 개발자 | Android Developers
developer.android.com
developer.android.com/about/versions/11/privacy/permissions?hl=ko
Android 11의 권한 업데이트 | Android 개발자 | Android Developers
Android 11에서는 사용자가 위치, 마이크, 카메라에 관해 더욱 세분화된 권한을 지정할 수 있습니다. 또한 시스템은 Android 11 이상을 타겟팅하는 사용하지 않는 앱의 권한을 재설정하며 앱은 시스
developer.android.com
developer.android.com/training/articles/user-data-ids?hl=ko
고유 식별자 권장사항 | Android 개발자 | Android Developers
이 문서에서는 사용 사례에 따라 앱에 적합한 식별자를 선택하는 방법을 설명합니다. Android 권한과 관련된 일반적인 내용은 권한 개요를 참조하세요. Android 권한을 사용하기 위한 구체적인 권장
developer.android.com
'Android > 개념 및 예제' 카테고리의 다른 글
[Kotlin] Recyclerview click Event (람다 함수 사용) (0) | 2021.02.16 |
---|---|
android 공식 문서를 영어로 봐야하는 이유 (0) | 2021.01.20 |
안드로이드 런타임 퍼미션(runtime permissions) (0) | 2021.01.19 |
구글 로그인 API - release key hash 등록하기 (2) | 2021.01.10 |
카카오 로그인 API - 출시를 위한 키 해시 등록하는 방법 (0) | 2021.01.10 |