[컴][안드로이드] 폰에서 자기 전화번호 불러오는 방법


전화번호 가져오기

사실 정확하게는 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로 전화번호가 읽어지지 않는경우 : 네이버 블로그



연락처 가져오기 방법




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



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;
        }
    }








댓글 없음:

댓글 쓰기