[Android SDK] [안드로이드] 핸드폰 번호, 기기 고유 id 등 단말기 정보 가져오기

안드로이드 앱 개발하면서 사용자의 핸드폰 번호, 기기 고유 id 등 정보를 많이 필요한데요. (앱 홍보 또는 여러 계정으로 앱에 가입 시 이벤트 제한 등등)

 

그래서 단말기 정보 가져오는 것을 알아볼 것입니다.

 

** 참고

Android 11에서는 앱에서 전화번호를 읽을 때 사용하는 전화 관련 권한이 변경됩니다.

앱이 Android 11 이상을 타겟팅하고 다음 목록에 표시된 전화번호 API에 액세스해야 한다면 READ_PHONE_STATE 권한 대신 READ_PHONE_NUMBERS 권한을 요청해야 합니다.

참고 : 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()를 사용해 가져올 수 있는데 위에서 선언한 권한을 사용자에게 허가받아야 합니다.

그래서 전화번호를 가져오기 전에 권한을 요청하겠습니다.

경축! 아무것도 안하여 에스천사게임즈가 새로운 모습으로 재오픈 하였습니다.
어린이용이며, 설치가 필요없는 브라우저 게임입니다.
https://s1004games.com

 

 

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

[출처] https://develop-writing.tistory.com/40

 

 

 

 

 

 

 

본 웹사이트는 광고를 포함하고 있습니다.
광고 클릭에서 발생하는 수익금은 모두 웹사이트 서버의 유지 및 관리, 그리고 기술 콘텐츠 향상을 위해 쓰여집니다.
번호 제목 글쓴이 날짜 조회 수
67 [Android SDK] [안드로이드] 접속된 네트워크 인터페이스의 IP 주소 가져오기 졸리운_곰 2024.05.02 191
» [Android SDK] [안드로이드] 핸드폰 번호, 기기 고유 id 등 단말기 정보 가져오기 file 졸리운_곰 2024.05.02 451
65 [Android SDK] Android) 안드로이드 Jsoup로 웹크롤링 하기 (예제포함) - "데일리 브리핑 앱 개발기" file 졸리운_곰 2024.05.01 139
64 [Android SDK] [Android] Activity 생명주기와 이동 file 졸리운_곰 2024.05.01 182
63 [Android SDK] [Android] EditText 읽기 전용으로 만들기 졸리운_곰 2024.05.01 120
62 [Android SDK] 안드로이드: 간단한 데이터를 저장하고 싶을 때(SharedPreferences 사용예제) 졸리운_곰 2024.05.01 145
61 [Android SDK] [Android] Jsoup 으로 파싱하기 file 졸리운_곰 2024.05.01 146
60 [Android SDK] [Android] 안드로이드 - 액티비티(Activity)로부터 결과 데이터 받아오기 file 졸리운_곰 2024.05.01 166
59 [Android SDK] [안드로이드/Android] 기기 네트워크 연결 상태 확인 file 졸리운_곰 2024.05.01 138
58 [Android SDK] 안드로이드 - 메시징 - Toast 졸리운_곰 2024.05.01 201
57 [Android SDK] [Android] 안드로이드 Alert 창 띄우기 file 졸리운_곰 2024.05.01 170
56 [Android SDK] 버튼을 클릭하면, 동작하는 코드를 작성하는 방법 졸리운_곰 2024.05.01 120
55 [Android SDK] [ Android ] a webview method was called on thread 'javabridge' 에러가 발생했을 때 졸리운_곰 2024.05.01 202
54 [Android SDK] [안드로이드] Thread, TimerTask, Handler 반복 호출 만들기 JAVA 졸리운_곰 2024.05.01 157
53 [Android SDK] [Android] postDelayed()를 이용해서 주기적 메소드 실행 졸리운_곰 2024.05.01 144
52 [Android SDK] Making Android WebView autorefresh periodically 졸리운_곰 2024.05.01 168
51 [Android SDK] [안드로이드] 시스템 멈추기 - Sleep() 사용법 file 졸리운_곰 2024.05.01 140
50 [Android SDK] 안드로이드 스레드 예제. 스레드로 고민해보기. (Android Thread UseCase) file 졸리운_곰 2024.05.01 143
49 [Android SDK] [Android] Thread의 interrupt()와 stop() file 졸리운_곰 2024.05.01 188
48 [Android SDK] [Android Studio] 간단하게 일정시간 지연시키는 딜레이주기 Delay 안드로이드 스튜디오 file 졸리운_곰 2024.05.01 105
대표 김성준 주소 : 경기 용인 분당수지 U타워 등록번호 : 142-07-27414
통신판매업 신고 : 제2012-용인수지-0185호 출판업 신고 : 수지구청 제 123호 개인정보보호최고책임자 : 김성준 sjkim70@stechstar.com
대표전화 : 010-4589-2193 [fax] 02-6280-1294 COPYRIGHT(C) stechstar.com ALL RIGHTS RESERVED