안드로이드 단말기(device 기기) 정보(계정, 고유 정보값) 가져오기 :: 소림사의 홍반장!

// device 고유 정보값 가져오기

    Log.d(tag, "BOARD: " + Build.BOARD);

    Log.d(tag, "BRAND: " + Build.BRAND);

    Log.d(tag, "CPU_ABI: " + Build.CPU_ABI);

    Log.d(tag, "DEVICE: " + Build.DEVICE);

    Log.d(tag, "DISPLAY: " + Build.DISPLAY);

    Log.d(tag, "FINGERPRINT: " + Build.FINGERPRINT);

    Log.d(tag, "HOST: " + Build.HOST);

    Log.d(tag, "ID: " + Build.ID);

    Log.d(tag, "MANUFACTURER: " + Build.MANUFACTURER);

    Log.d(tag, "MODEL: " + Build.MODEL);

    Log.d(tag, "PRODUCT: " + Build.PRODUCT);

    Log.d(tag, "TAGS: " + Build.TAGS);

    Log.d(tag, "TIME: " + Build.TIME);

    Log.d(tag, "TYPE: " + Build.TYPE);

    Log.d(tag, "USER: " + Build.USER);

       

       

 // device 정보 가져오기

    TelephonyManager telephony=(TelephonyManager)getSystemService(Context.TELEPHONY_SERVICE);

       

    Log.d(tag, "getCallState : "+telephony.getCallState());

    Log.d(tag, "getDataActivity : "+telephony.getDataActivity());

    Log.d(tag, "getDataState : "+telephony.getDataState());

    Log.d(tag, "getDeviceId : "+telephony.getDeviceId());

    Log.d(tag, "getDeviceSoftwareVersion : "+telephony.getDeviceSoftwareVersion());

    Log.d(tag, "getLine1Number : "+telephony.getLine1Number());

    Log.d(tag, "getNetworkCountryIso : "+telephony.getNetworkCountryIso());

    Log.d(tag, "getNetworkOperator : "+telephony.getNetworkOperator());

    Log.d(tag, "getNetworkOperatorName : "+telephony.getNetworkOperatorName());

    Log.d(tag, "getNetworkType : "+telephony.getNetworkType());

    Log.d(tag, "getPhoneType : "+telephony.getPhoneType());

    Log.d(tag, "getSimCountryIso : "+telephony.getSimCountryIso());

    Log.d(tag, "getSubscriberId : "+telephony.getSubscriberId());

    Log.d(tag, "getVoiceMailAlphaTag : "+telephony.getVoiceMailAlphaTag());

    Log.d(tag, "getVoiceMailNumber : "+telephony.getVoiceMailNumber());

    Log.d(tag, "isNetworkRoaming : "+telephony.isNetworkRoaming());

    Log.d(tag, "hasIccCard : "+telephony.hasIccCard());

    Log.d(tag, "hashCode : "+telephony.hashCode());

    Log.d(tag, "toString : "+telephony.toString());

       

// device 계정 정보 가져오기

    Account[] accounts =  AccountManager.get(getApplicationContext()).getAccounts();

    Account account = null;

                 

    for(int i=0;i<accounts.length;i++) {

          account = accounts[i];

          Log.d(tag, "Account - name: " + account.name + ", type :" + account.type);

 

          if(account.type.equals("com.google")){     //이러면 구글 계정 구분 가능

                       

          }

    }



(출처) http://kaludin.egloos.com/2649686

 

 

 (참고)http://developer.android.com/reference/android/telephony/TelephonyManager.html

현재 단말기의 전화번호를 가져오고자 할때 사용한다. 

     ((TelephonyManager) context.getSystemService(Context.TELEPHONY_SERVICE)).getLine1Number()


그리고 아래는 단말기와 관련된 내용

 

  1. AndroidManifest.xml 에 아래 권한 추가
     <uses-permission android:name="android.permission.READ_PHONE_STATE" />

  2. 아래와 같이 Context.getSystemService 를 통해 TelephonyManager 를 가져옴.
       TelephonyManager telephony = (TelephonyManager)getSystemService(Context.TELEPHONY_SERVICE);
        
  3. TelephonyManager 의 메소드 들 중, getLine1Number() 메소드가 전화번호를 반환
       String  telPhoneNo = telephony.getLine1Number();  

 

   출처 ( http://icess.egloos.com/3279459 )     



 


그리고 아래는 좀 더 많은 내용. 
분명 필요한 순간이 있을것이다. 잘 기억해두자.
=========================================================================================

android.telephony 패키지의 TelephonyManager클래스에서 담당한다.

단말기의 모뎀상태에 대한 정보를 얻기 위해서는 READ_PHONE_STATE권한이 필요하다.
AndroidManifest.xml파일에 아래 내용을 추가한다.
<uses-permission 
android:name="android.permission.READ_PHONE_STATE">
</uses-permission>

◆ 단말기의 모뎀상태 조회
TelephonyManager 객체를 얻기 위해서는 Context 객체에서 제공하는 getSystemService() 메서드를 이용한다.
TelephonyManager tm = (TelephonyManager) 
getSystemService(TELEPHONY_SERVICE);

음성통화 상태 조회
CALL_STATE_IDLE/CALL_STATE_OFFHOOK/CALL_STATE_RINGING 등의 값을 반환
Log.d("PHONE", "getCallState :" + tm.getCallState());
데이터통신 상태 조회
DATA_DISCONNECTED/DATA_CONNECTING/DATA_CONNECTED/DATA_SUSPENDED 등의 값을 반환
Log.d("PHONE", "getDataState :" + tm.getDataState());
단말기 ID 조회
GSM방식 IMEI 또는 CDMA방식의 MEID 값을 반환
Log.d("PHONE", "getDeviceId :" + tm.getDeviceId());
SW버전 조회
GSM방식의 IMEI/SV와 같은 SW버전을 반환
Log.d("PHONE", "getDeviceSoftwareVersion :" + tm.getDeviceSoftwareVersion());
전화번호 조회
GSM방식의 MSISDN과 같은 전화번호 반환
Log.d("PHONE", "getLine1Number :" + tm.getLine1Number());
국가코드 조회
현재 등록된 망 사업자의 MCC(Mobile Country Code)에 대한 ISO 국가코드 반환
Log.d("PHONE", "getNETWORKCountryIso :" + tm.getNetworkCountryIso());
Log.d("PHONE", "getSimCountryIso :" + tm.getSimCountryIso());
망 사업자코드 조회
현재 등록된 망 사업자의 MCC+MNC(Mobile Network Code) 반환
Log.d("PHONE", "getNetworkOperator :" + tm.getNetworkOperator());
Log.d("PHONE", "getSimOperator :" + tm.getSimOperator());
망 사업자명 조회
현재 등록된 망 사업자명 반환
Log.d("PHONE", "getNetworkOperatorName :" + tm.getNetworkOperatorName());
Log.d("PHONE", "getSimOperatorName :" + tm.getSimOperatorName());
망 시스템 방식 조회
현재 단말기에서 사용중인 망 시스템 방식을 반환
NETWORK_TYPE_UNKNOWN/
GSM방식 :  NETWORK_TYPE_GPRS/NETWORK_TYPE_EDGE/NETWORK_TYPE_UMTS/
NETWORK_TYPE_HSDPA/NETWORK_TYPE_HSUPA/NETWORK_TYPE_HSPA
CDMA방식 : NETWORK_TYPE_CDMA/NETWORK_TYPE_EVDO_0/NETWORK_TYPE_EVDO_A/NETWORK_TYPE_1xRTT
Log.d("PHONE", "getNetworkType :" + tm.getNetworkType());
단말기 종류 조회
단말기에서 지원하는 망의 종류를 반환
PHONE_TYPE_NONE/PHONE_TYPE_GSM/PHONE_TYPE_CDMA 등의 값을 반환
Log.d("PHONE", "getPhoneType :" + tm.getPhoneType());
SIM카드 Serial Number 조회
Log.d("PHONE", "getSimSerialNumber :" + tm.getSimSerialNumber());
SIM카드 상태 조회
SIM_STATE_UNKNOWN/SIM_STATE_ABSENT/SIM_STATE_PIN_REQUIRED/SIM_STATE_PUK_REQUIRED/
SIM_STATE_NETWORK_LOCKED/SIM_STATE_READY 등의 값을 반환
Log.d("PHONE", "getSimState :" + tm.getSimState());
가입자 ID 조회
GSM방식의 IMSI와 같은 가입자 ID 반환
Log.d("PHONE", "getSubscriberId :" + tm.getSubscriberId());

◆ 조회결과
getCallState :0(CALL_STATE_IDLE)
getDataState :2(DATA_ACTIVITY_OUT)
getDeviceId :000000000000000
getDeviceSoftwareVersion :null
getLine1Number :15555218135
getNetworkCountryIso :us
getNetworkOperator :310260
getNetworkOperatorName :Android
getNetworkType :3(NETWORK_TYPE_UMTS)
getPhoneType :1(PHONE_TYPE_GSM)
getSimCountryIso :us
getSimOperator :310260
getSimOperatorName :Android
getSimSerialNumber :89014103211118510720
getSimState :5(SIM_STATE_READY)
getSubscriberId :310260000000000

실제상황에서는 이와같이 현재 단말기의 상태를 직접 조회하는것이 아니라 
상태정보가 변경될 때 자동으로 인식해야하는 상황이 훨씬 많을것이다.
이럴때는 TelephonyManager의 listen()를 이용하여 콜백메서드를 등록하면 가능하다.
        tm.listen(new PhoneStateListener(){
         public void onCallStateChanged(int state, String incomingNumber){
         if (state == TelephonyManager.CALL_STATE_RINGING){
         Log.d("Telephony", "state = " + state + ", number = " + incomingNumber);
         }else{
         Log.d("Telephony", "state = " + state);
         }        
         }
        }, PhoneStateListener.LISTEN_CALL_STATE);

onCallStateChanged() 이외에도 아래와 같은 상태변화를 감지할 수 있다.
- onCallForwardingIndicatorChanged() : 호전환(Call Forwarding) 상태 변화
- onCellLocationChanged() : 단말기의 Cell위치 변화
- onDataActivity() : Data 활성화 상태 변화
- onDataConnectionStateChanged() : Data 연결상태 변화
- onMessageWaitingIndicatorChanged() : 메시지 대기상태 변화
- onServiceStateChanged() : 단말기의 서비스 상태 변화
- onSignalStrengthsChanged() : 망의 신호강도 변화

◆ 전화번호 처리
각 국가별로 전화번호의 형식이 다르다. 
한국은 01x-xxxx-xxxx 이 일반적이고,
북미는 xxx-xxx-xxxx가 된다.
PhoneNumberUtils.formatNumber() 메서드를 사용하면 설정된 Locale에 맞게 형식화 된다.
String formattedTelNumber = PhoneNumberUtils.formatNumber("01098761234");
        Log.d("Telephony", "formattedTelNumber :" + formattedTelNumber);
Locale을 English(United States)로 할경우 010-987-61234로 출력된다.
한국어로 할 경우는 01098761234가 그대로 출력된다.
formatNumber() 메서드의 구현내용을 살펴봐야 할듯 하다.

EditText에서 전화번호를 입력받을 경우에도 자동으로 형식화가 가능하다.
EditText객체의 addTextChangedListener에 PhoneNumberFormattingTextWatcher()를 등록하기만 하면 된다.
        EditText tn = (EditText) findViewById(R.id.edtTelNumber);
        tn.addTextChangedListener(new PhoneNumberFormattingTextWatcher());
그러나 역시 한국어로는 동작하지 않았다.

 


다른 카테고리의 글 목록

Dev. 안드로이드/참고소스 카테고리의 포스트를 톺아봅니다