안드로이드 - SMS, MMS 문자 코드로 보내기

하나를하더라도최선을 2020-01-29 13:05:30 14 0 0

스마트폰으로 문자를 전송할떄 보통은 SMS라고 나타내지만, 사실 80자 이내 단문을 그렇게 표현하는것이다.

그 이상 넘어가는걸 mms 라고 한다. mms는 이미지도 포함될수있는 Multi Messeging Service의 줄임말이다. sms는 Short Message Service이다.

해당 포스팅은 단순하게 문자는 보내는 intent를 실행하는 코드가 아니라, mms를 코드상 동작시켜서 보내는것이다.

smsmanager을 통해 아주 쉽고, 편하게 보낼수있지만 이미지를 첨부할수없다는점, 80자를 넘어가면 안날라가는점이 단점이다. (사실 그이상 용도로 필요하진...)

그리고 MMS는 통신사별, 기기별로 될수도있고, 안될수도있기때문에 너무 큰 기대는하지말자

아래의 코드는 상대측이 안드로이뿐아니라 아이폰인경우(버전은 모르겠음) 되는걸 확인했고,

LG유플러스는 되는지 안되는지 표본이 없어서 모르겠다.

그래서 앱으로 문자보내는 기능을 구현하고싶다면, 그냥 SMS를 구현하는게 정신건강에 좋다

MMS는 100% 보장되는 코드를 찾을수없었다.

MMS와 SMS 비용은 아래 링크를 참조하면 어떤 느낌인지 알거다. MMS로 보내도 단문이면 SMS 비용으로 된다는 애기도 있는대, 사실인지는 잘모르겠다.

아래 사진 링크

정확한 내용은 포스팅에 사용된 원본 라이브러리

Github - klinker41/android-smsmms 를 참조하면된다. Apache - license이다.

*** 단, 여기서 중요한건 Transaction.class를 일부 주석처리해서 사용해야하는것이다. ***

*** 그대로 사용하면 전송이 안된다 ***

무슨 뜻이냐면 Transaction.class를 아래 라이브러리를 가져와서 쓰는게아니라, 여기 라이브러리에 있던 파일을

일부 주석처리해서 따로 사용해야한다는 것이다.


1. 아래 링크에서 Transaction 파일을 다운받아서 프로젝트에 넣어놓는다.

Transaction.class 다운로드 링크

2. Gradle 파일에 아래 라이브러리를 종속시킨다.

implementation 'com.klinkerapps:android-smsmms:5.1.0'

3. Manifest 파일에 아래 TransactionService를 추가

<service android:name="com.android.mms.transaction.TransactionService"/>

4. Manifest 파일에 아래처럼 권한을 추가한다. smsmms라고 주석친부분이 깃허브 해당 라이브러리 주인이 권장하는 부분이다.

(저장공간쓰기, 전화권한, Contatc 권한 등은

따로 추가하지않아도된다.)

<!-- smsmms--> <uses-permission android:name="android.permission.SEND_SMS"/> <uses-permission android:name="android.permission.READ_SMS" /> <uses-permission android:name="android.permission.WRITE_SMS"/> <uses-permission android:name="android.permission.RECEIVE_SMS"/> <uses-permission android:name="android.permission.RECEIVE_MMS"/> <uses-permission android:name="android.permission.VIBRATE"/> <uses-permission android:name="android.provider.Telephony.SMS_RECEIVED" /> <uses-permission android:name="android.permission.INTERNET" /> <uses-permission android:name="android.permission.ACCESS_WIFI_STATE" /> <uses-permission android:name="android.permission.CHANGE_WIFI_STATE" /> <uses-permission android:name="android.permission.CHANGE_NETWORK_STATE" /> <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" /> <!--저장공간쓰기기--> <uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE"/> <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/> <!--전화 권한--> <uses-permission android:name="android.permission.READ_PHONE_STATE"/> <uses-permission android:name="android.permission.CALL_PHONE"/> <!-- Conteact 권한--> <uses-permission android:name="android.permission.WRITE_CONTACTS"/> <uses-permission android:name="android.permission.READ_CONTACTS"/> <uses-permission android:name="android.permission.FOREGROUND_SERVICE"/>

5. MMS를 보내보자

이미지의 경우 drawable 폴더에있는걸 쓸수도있고,

스마트폰에 저장된 이미지를 쓸수도있는대

둘다 비트맵으로 변환을 시켜야한다

아래 코드에서 주석을 제거하고, 사용하면된다.

public void sendMMS(String phone) { Log.d(TAG, "sendMMS(Method) : " + "start"); String subject = "제목"; String text = "내용"; // 예시 (절대경로) : String imagePath = "/storage/emulated/0/Pictures/Screenshots/Screenshot_20190312-181007.png"; String imagePath = "이미지 경로"; Log.d(TAG, "subject : " + subject); Log.d(TAG, "text : " + text); Log.d(TAG, "imagePath : " + imagePath); Settings settings = new Settings(); settings.setUseSystemSending(true); // TODO : 이 Transaction 클래스를 위에 링크에서 다운받아서 써야함 Transaction transaction = new Transaction(this, settings); // 제목이 있을경우 Message message = new Message(text, phone, subject); // 제목이 없을경우 // Message message = new Message(text, number); if(!(imagePath.equals("") || imagePath == null)) { // 예시2 (앱 내부 리소스) : // Bitmap mBitmap = BitmapFactory.decodeResource(mContext.getResources(), R.drawable.mms_test_1); Bitmap mBitmap = BitmapFactory.decodeFile(imagePath); // TODO : image를 여러장 넣고 싶은경우, addImage를 계속호출해서 넣으면됨 message.addImage(mBitmap); } long id = android.os.Process.getThreadPriority(android.os.Process.myTid()); transaction.sendNewMessage(message, id);
/div>

댓글 0개

첫 번째 댓글을 작성해보세요!