본문 바로가기

Android/개념 및 예제

[안드로이드] 핸드폰 번호, 기기 고유 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의 권한 업데이트  |  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