안드로이드 앱 개발하면서 사용자의 핸드폰 번호, 기기 고유 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 버전에 대응할 것입니다.
타겟 버전이 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
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
참고 : developer.android.com/reference/android/provider/Settings.Secure
developer.android.com/about/versions/11/privacy/permissions?hl=ko
developer.android.com/training/articles/user-data-ids?hl=ko
'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 |