전화번호 가져오기
사실 정확하게는 MSISDN 값을 가져온다고 해야 할 듯 하다. 왜냐하면, GSM 에서는 MSISDN 을 전화번호로 사용하는 듯 하지만, 북미에서 예전에는 MIN 을 전화번호로 사용했다고 한다.
getLine1Number 사용
Programmatically obtain the phone number of the Android phone - Stack Overflow : 전화번호를 가져온다. 그런데 댓글들을 확인해 보면, 문제는 SIM 에 전화번호가 보통 기록되어 있지 않을 수 있다고 한다. 그래서 TelephonyManager 를 이용하는 것은 완전하지 않은 듯 보인다.android - How to get phone number from an incoming call? - Stack Overflow : 하지만 이처럼 incoming call 에서 전화번호를 얻어오는 것은 훨씬 가능한 일이다.
getLine1Number로 전화번호를 못가져오는 경우들
Android: getLine1Number로 전화번호가 읽어지지 않는경우? - 앱개발 질문 - 안드로이드 개발 질문/답변getLine1Number로 전화번호가 읽어지지 않는경우 : 네이버 블로그
연락처 가져오기 방법
- 수르카-Android - 연락처 가져오기
- 안드로이드 개발 - 연락처 선택/정보 가져오기(ACTION_PICK) :: JHRunning
- Lucky Days :: [안드로이드] 연락처(전화번호부) 정보 가져오기
IMSI 와 MSISDN
전화번호를 가져오는 것과 관련해서 IMSI 와 MSISDN 에 대한 개념이 좀 더 분명해 져야 했다. 그래서 좀 더 알아봤다.
- IMP's Blog: 이동통신 각종 식별번호 개념잡기(IMSI, MSISDN, MIN등) : 이 글에서 MSISDN 부분을 보면 "전화번호" 가 무엇을 이야기 하는 지 알려준다.
- IMSI Vs MSISDN : MSISDN 이 SIM 에 없다고 이야기 해준다. 우리가 SIM을 잃어버려도 다시 SIM 만 구입해도 원래의 번호를 사용할 수 있는 것도 이 덕분이다. IMSI 는 우리가 전화기 전원을 켜서 통신사 기지국에 대한 사용을 허가받을 때 쓴다. 이녀석은 우리가 웹페이지등에 login 을 할 때 쓰는 id 같은 존재라고 보면 된다.
이 IMSI + MSISDN 을 이용해서 고유한 ID 를 형성하는 듯 하다. - IT는 이제 삶속에.. :: IMEI, IMSI, MSISDN 단말식별자 : 여기서도 IMSI 는 SIM 에 unique 하게 들어있지만, MSISDN 은 그렇지 않다고 한다. 보통 MSISDN 이 call 을 routing 하는 데 쓰인다고 한다.
Phone number 관련 library
- googlei18n/libphonenumber · GitHub : formatter 같은 것들을 제공 해 준다. 이녀석이 아마 android 내부에서 쓰이는 듯 하다.
- PhoneNumberUtils | Android Developers : 이것이 android 에서 제공하는 api 이다. 이 녀석의 내부에서 PhoneNumberUtil 이 쓰인다.
See Also
결론
일단 MSISDN 이 SIM 에 없는 경우도 있다는 것을 알았다. 그러나 기본적으로 이 방법 말고는 딱히 바로 가져올 수 있는 법이 없어 보인다. (그래서 일부 글에서는 확실한 방법은 직접 입력하도록 하는 것이라고 한다.)일단 이것을 가져오도록 해 놓고, edittext 등을 통해 수정할 수 있도록 해 놓는 것도 방법이 될 수 있겠다.
소스를 보면, 여러가지 방식으로 시도하는 듯 하다. 대부분의 경우 SDK 가 번호를 가져올 수 있다고 보는게 맞을 지도 모르겠다.(추측)
public String getLine1NumberForSubscriber(int subId) { String number = null; try { ITelephony telephony = getITelephony(); if (telephony != null) number = telephony.getLine1NumberForDisplay(subId, mContext.getOpPackageName()); } catch (RemoteException ex) { } catch (NullPointerException ex) { } if (number != null) { return number; } try { IPhoneSubInfo info = getSubscriberInfo(); if (info == null) return null; return info.getLine1NumberForSubscriber(subId, mContext.getOpPackageName()); } catch (RemoteException ex) { return null; } catch (NullPointerException ex) { // This could happen before phone restarts due to crashing return null; } }
댓글 없음:
댓글 쓰기