반응형

안녕하세요..
아시는 내용이실수도 있구요..
또 미리 말씀드리지만..지금 쓰는 내용이 문제가 있을 경우 저에게 통보 없이 운영자님이 삭제하셔도 됨을 미리 말씀드립니다..
삼성에서 보안을 이유로 태클을 거는 사안인거 같아서요..
일단 구글링을 해서 관련 내용을 구한뒤 제가 조금 분석한 겁니다만..
까페에 피해가 가면 안되니까요..

제가 공부하면서 만들고자 하는 앱중에 사용자가 받은 문자를 읽어야 하는 내용이 있어서..
이걸 공부해봤는데..에뮬에서는 잘 되는데..제가 갖고 있는 폰인 갤럭시S2에서는 안되더군요..
검색을 해보니 갤럭시S의 경우 구글에서 정한 표준 프로바이더를 보안을 이유로 고쳐서 쓰더군요..
이는 LG나 팬텍도 마찬가지인거 같던데요..
제가 LG나 팬텍 폰은 갖고 있지 않아서 어려울듯 싶고..
구글링 해보면 모토로라나 HTC는 표준을 따른거 같더군요..
암튼 그래서 구글링을 해서 갤럭시S에서 사용중인 SMS 관련 컨텐트 프로바이더 문자열(content://com.sec.mms.provider/message)을 찾았습니다..
링크는 제가 알려드릴순 없구요(동의를 얻질 못해서..)
제가 관련 내용 없이 분석하다 보니 확실하지 않은 내용도 있습니다
그러니 실제로 테스트 해보면서 파악을 해보시길 권유해드립니다..

일단 파악된 컬럼은  
RootID, RegTime, MainType, SubType, Status, MDN1st, MDN2nd, Display, Chosung, Title, CallbackURL 컬럼입니다..
AppSecificData컬럼과 RawSmsPdu컬럼은 Blob 타입인거 같아서 MMS와 관련된 내용일것 같다는 추측은 해보는데..
getBlob같은 함수를 이용해서 아직 분석을 해보지 않은 관계로..
정확한 확인은 해보진 못했습니다..
그리고 ReservedData1, ReservedData2는 예약된 컬럼이기 때문에 현재로서는 신경을 쓰지 않으셔도 될듯 합니다..

안드로이드 구글 표준에 따르면 보낸 메시지 함과 받는 메시지 함에 대한 컨텐트 프로바이더의 Uri가 다르지만
갤럭시의 경우 보낸 메시지함과 받는 메시지 함을 따로 구분하지 않고 같은 컨텐트 프로바이더 Uri에서 관리합니다..
그래서 아무 조건을 걸지 않고 위의 Uri를 이용해서 조회하면 보낸 메시지와 받은 메시지 모두가 조회됩니다..

RootID엔 SMS 또는 MMS 한건에 고유ID를 부여한 값이 들어가 있습니다.
가장 최근의 SMS일수록 값이 크기 때문에
이 컬럼으로 정렬을 하면 가장 오래전것을 먼저 나오게 하거나 가장 최근것을 먼저 나오게 할 수 있습니다

RegTime엔 자바에서 long 타입의 숫자가 들어있습니다. 이것은 자바에서 System.currentTimeMillis() 함수가 리턴한 현재 시간을 long 타입으로 표현한 값이 들어가게 됩니다.
이는 바꿔말하면 이 long 타입 숫자를 역으로 분석해서 우리에게 익숙한 연월일 시분초 타입으로 표현할 수 있습니다.
관련 코딩은 다음과 같습니다..

long now = c.getLong(1);
SimpleDateFormat sdfNow = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
String strNow = sdfNow.format(new Date(now));

c.getLong(1)이 RegTime 컬럼 값을 리턴하고 있구요
이를 SimpleDateFormat과 Date 클래스를 이용하면 연-월-일 시:분:초 형태로 바꾸어줍니다..
이 표현 형태는 여러분들이 만드시는 앱에 따라 바꿔주시면 되구요..
그리고 이걸 약간 응용하시면 특정기간의 문자를 검색하실수도 있을 겁니다.
즉 특정날짜를 long 타입 숫자로 변환한 뒤에
그 값을 조건을 주어 검색하면 되겠죠

MainType 값으로 보낸 메시지인지, 받은 메시지인지 파악할수 있습니다.
0이면 받은 메시지이고 1이면 보낸 메시지 입니다.
그리고 이 컬럼으로 사용자가 스팸번호로 분류한 번호가 보낸 메시지인지도 파악할수 있습니다
이 값이 4이면 사용자가 스팸번호로 분류한 번호가 보낸 메시지임을 나타냅니다..
또 Status 값으로도 파악이 가능한데요 Status 값이 203이면 보낸 메시지, 1101이면 받은 메시지 입니다
다만 Status 성격이 상태라는 점을 감안하면 아마 보낸 메시지가 실패했을 경우 실패된 메시지에 대한 코드 값이 저장되면서 같이 보여지지 않을까 싶습니다
현재 이 부분은 제가 보내다가 실패한 메시지가 폰에 없어서 확인은 못했습니다
물론 MDN1st과 MDN2nd값으로도 파악이 가능합니다만
MainType으로 파악하시는것을 권유해드립니다.
MDN1st과 MDN2nd값으로 분간이 안되는 상황이 있습니다.

SubType은 메시지가 SMS인지, MMS인지를 구분합니다.
이 값이 0이면 SMS, 1이면 MMS로 보입니다.
이걸 확인했던건 보낸 메시지중 사진을 첨부한 메시지에서 SubType이 1이어서 그렇게 파악했습니다

MDN1st와 MDN2nd 엔 전화번호가 들어가게 됩니다
이 두 컬럼값을 이용해서도 보낸 메시지인지 받은 메시지인지 파악을 할수 있습니다.
이 두 컬럼 값이 같으면 받은 메시지이구요
다르면 보낸 메시지 입니다.
왜냐면 보낸 메시지 일 경우 MDN2nd 값에 자기 폰 번호가 들어가기 때문이죠..
즉 MDN1st와 MDN2nd 값이 같은 경우는 해당 번호의 사용자가 자기 폰에게 보낸 수신 메시지가 되구요
MDN1st와 MDN2nd 값이 다를 경우는 Mdn2nd 폰 번호인 자기 폰 번호가 MDN1st 번호에게 보낸 발신 메시지가 됩니다
하지만 이렇게 파악하는 경우는 문제가 있습니다.
받은 메시지인데도 이 두 컬럼 값이 달랐던 상황이 있었습니다
발견했던것 중 하나가 신용카드로 결재했을때 오는 신용카드 결재 문자더군요
예를 들어 저는 XX카드를 쓰는데요..
MDN1st엔 1588XXXX 이렇게 들어가지만
MDN2nd엔 전혀 다른 번호가 들어가더군요(여기에 들어가는 번호는 핸드폰 번호 형태가 아니거나 또는 일반 전화번호가 들어갑니다)
그래서 1588같은 특정 대표국번을 이용한 번호는 MDN1st에 들어가고
이 번호와 매핑되는 실제 전화번호가 MDN2nd에 들어가는 겁니다

Display와 Chosung엔 받은 메시지일 경우 메시지를 보낸 사람에 대한 정보가 검색되고 보낸 메시지일 경우 메시지를 받는 사람에 대한 정보가 검색됩니다
여기서 정보라고 표현한 이유는..
주소록에 관련 전화번호가 등록되어 있을 경우 주소록의 이름이 나오기 때문입니다..
만약 주소록에 등록되어 있지 않은 사람에게 보내거나 받으면 전화번호가 들어가게 됩니다. 대신 중간에 -이 들어가게 됩니다
Display와 Chosung의 차이는 주소록에 등록된 이름과 그 이름의 초성값이 들어가게 됩니다..
예를 들어 주소록에 '이미자' 란 이름이 등록되어 있다면
Display엔 이미자, Chosung엔 ㅇㅁㅈ 가 들어가게 됩니다.
하지만 주소록에 등록된 번호가 아니라면 
예를 들어 MDN1st나 MDN2nd에 01012345678이 있다면 전화번호가 010-1234-5678 이런식으로 중간에 -이 들어가는 형태의 전화번호가 들어옵니다.

Title엔 SMS 또는 MMS에서 사용자가 입력한 문구 자체가 들어옵니다. 엔터키도 내부적으로 적용되어 있더군요..그래서 표현할때 엔터키에 대해 별도 처리를 해야 한다면 감안 하셔야 합니다.

CallbackURL은 메시지를 열었을때 사용자가 입력한 문자가 아닌 어떤 웹페이지를 보여줘야 할 경우 웹페이지 URL이 들어가더군요
(예: http://vmg.nate.com:8083/xxxx/yyyy)
모바일 사용 청구서를 받았을때 CallbackURL 컬럼에 이런 주소가 들어가더군요
그래서 그렇게 추측하고 있습니다

그래서 일단 지금까지 파악한 바로는 이정도가 되었습니다. 
제가 검색했던 게시물 링크는 갤럭시S에만 한정되어 있지만..
갤럭시S2에대해서도 적용되는 걸로 봐서는 모든 갤럭시 시리즈에 다 적용이 되지 않을까 싶습니다..
갤럭시S, 갤럭시S2를 제외한 나머지 갤럭시 계열 폰에서도 한번 테스트 해봐주시고 알려주심 고맙겠습니다..



겔럭시 시리즈중 위의 URI로 안되는 기종이 있을겁니다. A였나?

content://com.btb.sec.mms.provider/message

위의 프로바이더로 쿼링하시면됩니다. 컬럼은 동일합니다.

LG의경우는 더욱 독특합니다.

기종별로 컨텐트 프로바이더URI가 막틀립니다.

왠간한 LG기종은

content://com.lge.messageprovider/msg/inbox

URI로 쿼링가능합니다. 컬럼 정보는 기억나는게 없어서;

송신 번호가 sender였고, body는 그대로 body입니다.

이런식으로 국내 제조사에서 만드는 폰들은 컨텐트프로바이더의 URI를 다 바꿔놓으니

개발자의 기분 참 상쾌합니다.

하지만 독자 디비를 개발하지 않는이상 숨길 수 없는법.

URI를 알고싶으시면 사용자에게 요청하세요. 개중 루팅유저라면 Messaging.apk을 꺼내서 보내달라면

보내줍니다. 디컴파일하시면 필요정보 모두 추출 가능합니다.



아..A는 또 그런가요? 어렵네요ㅠㅠ

일단 갤럭시S 이후 출시된 제품은 동일하다는 생각이 들어서 그런건데..

아예 이럴꺼면 제조사에서 저걸 접근하는 라이브러리를 따로 만든뒤에 배포해줘서..

그 라이브러리로만 접근 하는 것을 인정하게끔 하고..

그걸로만 접근할수 있게끔 해주면 좋을텐데요..

실제로 통신사 같은 경우는 사용자 전화번호를 얻어오기 위해 별도 라이브러리를 제공해줘서..

그걸로만 접근하게 해주거든요..

루팅유저에게 요청하면 그걸 알아낼수가 있는거군요..저 스스로 폰을 루팅하질 않다보니..그런쪽을 몰라서..ㅠㅠ..

댓글로 배웠습니다..고맙습니다..

반응형

+ Recent posts