ㄷㅣㅆㅣ's Amusement
[Android/JAVA] MMS 보내는 코드 본문
[Android/JAVA] MMS 보내는 코드
반응형
1. MMS는 SMS와는 달리 그냥 http-post를 하면 된다. 우선 네트워크 피처를 통해서 MMS 전송요청을 한다.
12 final ConnectivityManager connMgr = (ConnectivityManager)context.getSystemService(Context.CONNECTIVITY_SERVICE);final int result = connMgr.startUsingNetworkFeature( ConnectivityManager.TYPE_MOBILE, Phone.FEATURE_ENABLE_MMS); cs
2. result로 Phone.APN_REQUEST_STARTED를 받으면 BroadCastReciver를 등록하고 Phone.APN_ALREADY_ACTIVE가 올때까지 기다린다.
1234 final IntentFilter filter = new IntentFilter();filter.addAction(ConnectivityManager.CONNECTIVITY_ACTION);context.registerReceiver(reciver, filter);cs
3. 다음 코드와 같이 OMA스펙에 맞게 pdu를 만들어준다.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 | final SendReq sendRequest = new SendReq(); final EncodedStringValue[] sub = EncodedStringValue.extract(subject); if (sub != null && sub.length > 0) { sendRequest.setSubject(sub[0]); } final EncodedStringValue[] phoneNumbers = EncodedStringValue .extract(recipient); if (phoneNumbers != null && phoneNumbers.length > 0) { sendRequest.addTo(phoneNumbers[0]); } final PduBody pduBody = new PduBody(); if (parts != null) { for (MMSPart part : parts) { final PduPart partPdu = new PduPart(); partPdu.setName(part.Name.getBytes()); partPdu.setContentType(part.MimeType.getBytes()); partPdu.setData(part.Data); pduBody.addPart(partPdu); } } sendRequest.setBody(pduBody); final PduComposer composer = new PduComposer(this.context, sendRequest); final byte[] bytesToSend = composer.make(); HttpUtils.httpConnection(context, 4444L, MMSCenterUrl, bytesToSendFromPDU, HttpUtils.HTTP_POST_METHOD, !TextUtils .isEmpty(MMSProxy), MMSProxy, port); } | cs |
4. MMSCenterUrl, MMSProxy, port : MMS-APNs를 조회하여 가져올 수 있다.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 | public class APNHelper { public class APN { public String MMSCenterUrl = ""; public String MMSPort = ""; public String MMSProxy = ""; } public APNHelper(final Context context) { this.context = context; } public List<APN> getMMSApns() { final Cursor apnCursor = this.context.getContentResolver().query(Uri.withAppendedPath(Telephony.Carriers.CONTENT_URI, "current"), null, null, null, null); if ( apnCursor == null ) { return Collections.EMPTY_LIST; } else { final List<APN> results = new ArrayList<APN>(); if ( apnCursor.moveToFirst() ) { do { final String type = apnCursor.getString(apnCursor.getColumnIndex(Telephony.Carriers.TYPE)); if ( !TextUtils.isEmpty(type) && ( type.equalsIgnoreCase(Phone.APN_TYPE_ALL) || type.equalsIgnoreCase(Phone.APN_TYPE_MMS) ) ) { final String mmsc = apnCursor.getString(apnCursor.getColumnIndex(Telephony.Carriers.MMSC)); final String mmsProxy = apnCursor.getString(apnCursor.getColumnIndex(Telephony.Carriers.MMSPROXY)); final String port = apnCursor.getString(apnCursor.getColumnIndex(Telephony.Carriers.MMSPORT)); final APN apn = new APN(); apn.MMSCenterUrl = mmsc; apn.MMSProxy = mmsProxy; apn.MMSPort = port; results.add(apn); } } while ( apnCursor.moveToNext() ); } apnCursor.close(); return results; } } private Context context; | cs |
5. 마무리.
- MMS를 보내고 나서 보낸 기록을 db에 써야 다른 앱에서도 잘 보일것이다. 이 부분은 나중에 포스팅 하기로 하고... 개인적으로 보내는 것이 받는 것보다 훨신 쉬운 것 같다. 받는 것도 나중에 포스팅;;; 오늘은 이만~
광고는 누르실 필요 없지만 공감버튼은 부탁드려요~~
copy/paste되도록 모든 blocking을 해제했습니다만... 그래도 안되는 분은 OS와 browser를 댓글로 달아주세요~
반응형
'Programming > Android' 카테고리의 다른 글
[Android/Java] 병렬 프로그래밍 : Executor Framework에대한 고찰 ----- 1 (0) | 2016.12.01 |
---|---|
[Android/Java] Glide, An Image Loader. -- 1. Overview (0) | 2016.11.02 |
[Android/JAVA] MMS 보내는 코드 (20) | 2015.11.19 |
[Android/JAVA] WebView가 깜박일 때. (0) | 2015.11.19 |
Android Soft Keyboard (0) | 2015.11.07 |
안드로이드 시크바 (Android SeekBar) 손잡이(Thumb) 사이즈 조절 (0) | 2015.11.07 |
20 Comments
-
ㄷㅣㅆㅣ 2016.02.09 15:46 신고 히힛 ㅋㅋ 감사해요
- 개발자 2016.06.24 14:37 잘 보았습니다. 혹시 MMS 전송시 SUBJECT 관련하여 SKT단말기에서 깨지는 현상은 어떻게 해결하셨는지 여쭈어보고 싶습니다.
-
ㄷㅣㅆㅣ 2016.06.26 13:55 신고 혹시 보낼 때 character set을 지정했는지 확인해보세요~
-
ㄷㅣㅆㅣ 2016.11.16 18:12 신고 안녕하세요~~ 이 소스는 android-mms소스입니다.
5.0 이하를 받으시면 안에 포함되어있습니다~ -
ㄷㅣㅆㅣ 2016.11.16 18:11 신고 안녕하세요~~ 이 소스는 android-mms소스입니다.
5.0 이하를 받으시면 안에 포함되어있습니다~ -
ㄷㅣㅆㅣ 2016.11.16 18:06 신고 안녕하세요~~
모든 단말을 다 커버하지는 못하겠지만 왠만큼 잘 돌아갑니다.
안드로이드 6.0부터는 기존것을 버리고 새로 프로젝트를 시작했지만요, 심지어 7.0에서도 기존코드는 문제없이 돌아갑니다~~ -
ㄷㅣㅆㅣ 2016.11.16 18:10 신고 안녕하세요~~ 이 소스는 android-mms소스입니다.
5.0 이하를 받으시면 안에 포함되어있습니다~
바로 적용해도 메이저 단말에서는 정상동작 하겠으나 전체단말 대상으로 하려면 예외처리가 꾀 필요하네요;;; -
ㄷㅣㅆㅣ 2016.11.16 18:16 신고 많은 분들께서 문의하셔서 댓글로 남깁니다.
해당 소스는 android-mms입니다. Android 5.0 이하 소스를 받으시면 안에 포함되어있습니다.
해당소스를 바로 포팅하시면 메이저 단말에서는 정상작동하겠으나, 커버리지를 늘리려면 상당히 많은 예외처리가 필요하긴 합니다.
(예외처리가 들어간 소스는 공유드리기 어렵습니다. 저도 먹고 살아야지요 ㅎㅎ)
아울러, 6.0부터는 패키지 구조가 상당히 많이 바뀐, 왠지 처음부터 다시 개발한 듯한 소스가 포함되어있으나, 7.0까지 테스트해본 결과 기존 소스도 매우 잘 동작합니다.
프로젝트 진행에 문제가 없으시다면 일부러 바꾸실 필요는 없을 것으로 보입니다.
덧. 제가 생계를 위해서 iOS개발자로 전향하여 후속 포스팅을 하지 못했었으나, 오늘부터는 Android 개발자로 복귀하였습니다.
(어쩌다보니 양손잡이가 됐네요!! ㅋㅋ)
후속 포스팅(MMS 받는 부분 분석)은 이번달 내로 올릴 예정입니다.
이후에는 [DB에 쓰기], [RCS 메세지 보내기/받기 소스분석]등을 할 예정이나, 데드라인은 "2016년이 가기전"으로 다소 길게 잡았습니다. -
블루밍
2017.03.20 06:48
죄송한데 Android 5.0이하 소스를 받으면 포함되어 있다고 하셨는데 ..
그걸 어서 다운받죠??? 쌩초보라 죄송합니다... 알려 주시면 감사하겠습니다. -
블루밍
2017.03.20 06:48
죄송한데 Android 5.0이하 소스를 받으면 포함되어 있다고 하셨는데 ..
그걸 어서 다운받죠??? 쌩초보라 죄송합니다... 알려 주시면 감사하겠습니다. -
ㄷㅣㅆㅣ 2017.03.20 16:23 신고 http://source.android.com/source/downloading.html
에 가보시면 안드로이드 소스를 받는 방법에대해 나와있습니다~ -
김병희
2017.03.23 06:41
윈도우즈 7(64비트) 스윙 브라우저에서 복사가 되지 않습니다.
혹시 ... i.e에서 열어도 되지 않는군요.
부탁 드립니다. -
ㄷㅣㅆㅣ 2017.03.25 14:20 신고 따른 컨텐츠들 때문에 막아놨습니다
이메일 남겨주세요 -
김병희
2017.03.26 18:01
감사합니다.
손으로 베껴 써도 될 것 같습니다. -
김병희
2017.03.26 18:01
감사합니다.
손으로 베껴 써도 될 것 같습니다.