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

하나를하더라도최선을 2020-01-29 13:05:30 259 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개

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