Android에서 SMS 및 MMS 전송 및 수신 (Kit Android Android 4.4 이전)


131

SMS 메시지를 보내고받는 방법을 알아 냈습니다. SMS 메시지를 보내려면 클래스 의 sendTextMessage()and sendMultipartTextMessage()메소드 를 호출해야했습니다 SmsManager. SMS 메시지를 받으려면 AndroidMainfest.xml파일에 수신자를 등록해야했습니다 . 그런 다음의 onReceive()방법 을 재정의해야 했습니다 BroadcastReceiver. 아래에 예를 포함 시켰습니다.

MainActivity.java

public class MainActivity extends Activity {
    private static String SENT = "SMS_SENT";
    private static String DELIVERED = "SMS_DELIVERED";
    private static int MAX_SMS_MESSAGE_LENGTH = 160;

    // ---sends an SMS message to another device---
    public static void sendSMS(String phoneNumber, String message) {

        PendingIntent piSent = PendingIntent.getBroadcast(mContext, 0, new Intent(SENT), 0);
        PendingIntent piDelivered = PendingIntent.getBroadcast(mContext, 0,new Intent(DELIVERED), 0);
        SmsManager smsManager = SmsManager.getDefault();

        int length = message.length();          
        if(length > MAX_SMS_MESSAGE_LENGTH) {
            ArrayList<String> messagelist = smsManager.divideMessage(message);          
            smsManager.sendMultipartTextMessage(phoneNumber, null, messagelist, null, null);
        }
        else
            smsManager.sendTextMessage(phoneNumber, null, message, piSent, piDelivered);
        }
    }

    //More methods of MainActivity ...
}

SMSReceiver.java

public class SMSReceiver extends BroadcastReceiver {
    private final String DEBUG_TAG = getClass().getSimpleName().toString();
    private static final String ACTION_SMS_RECEIVED = "android.provider.Telephony.SMS_RECEIVED";
    private Context mContext;
    private Intent mIntent;

    // Retrieve SMS
    public void onReceive(Context context, Intent intent) {
        mContext = context;
        mIntent = intent;

        String action = intent.getAction();

        if(action.equals(ACTION_SMS_RECEIVED)){

            String address, str = "";
            int contactId = -1;

            SmsMessage[] msgs = getMessagesFromIntent(mIntent);
            if (msgs != null) {
                for (int i = 0; i < msgs.length; i++) {
                    address = msgs[i].getOriginatingAddress();
                    contactId = ContactsUtils.getContactId(mContext, address, "address");
                    str += msgs[i].getMessageBody().toString();
                    str += "\n";
                }
            }   

            if(contactId != -1){
                showNotification(contactId, str);
            }

            // ---send a broadcast intent to update the SMS received in the
            // activity---
            Intent broadcastIntent = new Intent();
            broadcastIntent.setAction("SMS_RECEIVED_ACTION");
            broadcastIntent.putExtra("sms", str);
            context.sendBroadcast(broadcastIntent);
        }

    }

    public static SmsMessage[] getMessagesFromIntent(Intent intent) {
        Object[] messages = (Object[]) intent.getSerializableExtra("pdus");
        byte[][] pduObjs = new byte[messages.length][];

        for (int i = 0; i < messages.length; i++) {
            pduObjs[i] = (byte[]) messages[i];
        }
        byte[][] pdus = new byte[pduObjs.length][];
        int pduCount = pdus.length;
        SmsMessage[] msgs = new SmsMessage[pduCount];
        for (int i = 0; i < pduCount; i++) {
            pdus[i] = pduObjs[i];
            msgs[i] = SmsMessage.createFromPdu(pdus[i]);
        }
        return msgs;
    }

    /**
    * The notification is the icon and associated expanded entry in the status
    * bar.
    */
    protected void showNotification(int contactId, String message) {
        //Display notification...
    }
}

AndroidManifest.xml

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="com.myexample"
    android:versionCode="1"
    android:versionName="1.0" >

    <uses-sdk
        android:minSdkVersion="16"
        android:targetSdkVersion="17" />

    <uses-permission android:name="android.permission.READ_CONTACTS" />
    <uses-permission android:name="android.permission.READ_PHONE_STATE" />
    <uses-permission android:name="android.permission.SEND_SMS" />
    <uses-permission android:name="android.permission.RECEIVE_SMS" />
    <uses-permission android:name="android.permission.READ_SMS" />
    <uses-permission android:name="android.permission.WRITE_SMS" />
    <uses-permission android:name="android.permission.RECEIVE_MMS" />
    <uses-permission android:name="android.permission.WRITE" />
    <uses-permission android:name="android.permission.VIBRATE" />
    <uses-permission android:name="android.permission.INTERNET" />
    <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />

    <application
        android:debuggable="true"
        android:icon="@drawable/ic_launcher_icon"
        android:label="@string/app_name" >

        <activity
            //Main activity...
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />

                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>
        <activity
            //Activity 2 ...
        </activity>
        //More acitivies ...

        // SMS Receiver
        <receiver android:name="com.myexample.receivers.SMSReceiver" >
            <intent-filter>
                <action android:name="android.provider.Telephony.SMS_RECEIVED" />
            </intent-filter>
        </receiver>

    </application>
</manifest>

그러나 비슷한 방식으로 MMS 메시지를 보내고받을 수 있는지 궁금합니다. 몇 가지 조사를 수행 한 후 블로그에 제공된 많은 예제는 단순히 Intent기본 메시징 응용 프로그램으로 전달 됩니다. 신청서를 남기지 않고 MMS를 보내려고합니다. MMS를 보내고받는 표준 방법은없는 것 같습니다. 누구든지 작동하도록 했습니까?

또한 SMS / MMS ContentProvider가 공식 Android SDK의 일부가 아니라는 것을 알고 있지만 누군가가 이것을 구현할 수 있다고 생각했습니다. 도움을 주시면 감사하겠습니다.

최신 정보

MMS 메시지를 받기 BroadcastReceiver위해 AndroidManifest.xml파일에를 추가했습니다

<receiver android:name="com.sendit.receivers.MMSReceiver" >
    <intent-filter>
        <action android:name="android.provider.Telephony.WAP_PUSH_RECEIVED" />

        <data android:mimeType="application/vnd.wap.mms-message" />
    </intent-filter>
</receiver>

MMSReceiver 클래스에서이 onReceive()메소드는 메시지가 전송 된 phoneNumber 만 가져올 수 있습니다. 파일 경로와 미디어 첨부 파일 (이미지 / 오디오 / 비디오) 또는 MMS의 텍스트와 같은 MMS에서 다른 중요한 것들을 어떻게 잡습니까?

MMSReceiver.java

public class MMSReceiver extends BroadcastReceiver {
    private final String DEBUG_TAG = getClass().getSimpleName().toString();
    private static final String ACTION_MMS_RECEIVED = "android.provider.Telephony.WAP_PUSH_RECEIVED";
    private static final String MMS_DATA_TYPE = "application/vnd.wap.mms-message";

     // Retrieve MMS
    public void onReceive(Context context, Intent intent) {

        String action = intent.getAction();
        String type = intent.getType();

        if(action.equals(ACTION_MMS_RECEIVED) && type.equals(MMS_DATA_TYPE)){

            Bundle bundle = intent.getExtras();

            Log.d(DEBUG_TAG, "bundle " + bundle);
            SmsMessage[] msgs = null;
            String str = "";
            int contactId = -1;
            String address;

            if (bundle != null) {

                byte[] buffer = bundle.getByteArray("data");
                Log.d(DEBUG_TAG, "buffer " + buffer);
                String incomingNumber = new String(buffer);
                int indx = incomingNumber.indexOf("/TYPE");
                if(indx>0 && (indx-15)>0){
                    int newIndx = indx - 15;
                    incomingNumber = incomingNumber.substring(newIndx, indx);
                    indx = incomingNumber.indexOf("+");
                    if(indx>0){
                        incomingNumber = incomingNumber.substring(indx);
                        Log.d(DEBUG_TAG, "Mobile Number: " + incomingNumber);
                    }
                }

                int transactionId = bundle.getInt("transactionId");
                Log.d(DEBUG_TAG, "transactionId " + transactionId);

                int pduType = bundle.getInt("pduType");
                Log.d(DEBUG_TAG, "pduType " + pduType);

                byte[] buffer2 = bundle.getByteArray("header");      
                String header = new String(buffer2);
                Log.d(DEBUG_TAG, "header " + header);

                if(contactId != -1){
                    showNotification(contactId, str);
                }

                // ---send a broadcast intent to update the MMS received in the
                // activity---
                Intent broadcastIntent = new Intent();
                broadcastIntent.setAction("MMS_RECEIVED_ACTION");
                broadcastIntent.putExtra("mms", str);
                context.sendBroadcast(broadcastIntent);

            }
        }

    }

    /**
    * The notification is the icon and associated expanded entry in the status
    * bar.
    */
    protected void showNotification(int contactId, String message) {
        //Display notification...
    }
}

android.provider.Telephony문서에 따르면 :

브로드 캐스트 조치 : 장치가 새로운 텍스트 기반 SMS 메시지를 수신했습니다. 의도에는 다음과 같은 추가 값이 있습니다.

pdus- Object[]byte[]메시지를 구성하는 PDU를 포함하는의.

추가 값은 사용하여 추출 될 수 getMessagesFromIntent(android.content.Intent) 는 적절 결과 코드를 설정해야이 의도 된 브로드 캐스트의 처리 중에 오류가 발생하면.

 @SdkConstant(SdkConstantType.BROADCAST_INTENT_ACTION)
 public static final String SMS_RECEIVED_ACTION = "android.provider.Telephony.SMS_RECEIVED";

브로드 캐스트 조치 : 장치가 새로운 데이터 기반 SMS 메시지를 수신했습니다. 의도에는 다음과 같은 추가 값이 있습니다.

pdus- Object[]byte[]메시지를 구성하는 PDU를 포함하는의.

추가 값은 getMessagesFromIntent (android.content.Intent)를 사용하여 추출 할 수 있습니다. 이 의도를 처리하는 동안 BroadcastReceiver에 오류가 발생하면 결과 코드를 적절하게 설정해야합니다.

@SdkConstant(SdkConstantType.BROADCAST_INTENT_ACTION)
public static final String DATA_SMS_RECEIVED_ACTION = "android.intent.action.DATA_SMS_RECEIVED";

브로드 캐스트 조치 : 장치가 새로운 WAP PUSH 메시지를 수신했습니다. 의도에는 다음과 같은 추가 값이 있습니다.

transactionId (Integer) -WAP 거래 ID

pduType (Integer) -WAP PDU 유형

header (byte[]) -메시지 헤더

data (byte[]) -메시지의 데이터 페이로드

contentTypeParameters (HashMap<String,String>) -컨텐츠 유형과 연관된 모든 매개 변수 (WSP 컨텐츠 유형 헤더에서 디코딩 됨)

이 의도를 처리하는 동안 BroadcastReceiver에 오류가 발생하면 결과 코드를 적절하게 설정해야합니다. contentTypeParameters 추가 값은 해당 이름으로 키가 지정된 컨텐츠 매개 변수의 맵입니다. 할당되지 않은 잘 알려진 매개 변수가 발견되면 맵의 키는 '지정되지 않은 / 0x ...'가됩니다. 여기서 '...'는 지정되지 않은 매개 변수의 16 진수 값입니다. 매개 변수에 No-Value가 있으면 맵의 값이 널입니다.

@SdkConstant(SdkConstantType.BROADCAST_INTENT_ACTION)
public static final String WAP_PUSH_RECEIVED_ACTION = "android.provider.Telephony.WAP_PUSH_RECEIVED";

업데이트 # 2

브로드 캐스트 리시버가 수신하지 않는 Android PendingIntent 엑스트라를PendingIntent 수신하여 추가로 전달하는 방법을 알아 냈습니다 BroadcastReceiver.

그러나 여분이 전달됩니다 SendBroadcastReceiver 하지 SMSReceiver . SMSReceiver에 엑스트라를 전달하려면 어떻게 해야 합니까?

업데이트 # 3

MMS 받기

그래서 더 많은 연구를 한 후에 나는 등록에 대한 제안을 보았습니다 ContentObserver. 이렇게하면 content://mms-sms/conversations콘텐츠 공급자에 변경 사항이있을 때 이를 감지하여 들어오는 MMS를 감지 할 수 있습니다. 이것이 내가 찾은 가장 효과적인 예입니다. MMS 받기

그러나 mainActivity유형 의 변수 가 ServiceController있습니다. ServiceController수업 은 어디에서 시행됩니까? 등록 된 다른 구현이 ContentObserver있습니까?

MMS 전송

MMS 전송과 관련하여 다음 예제를 보았습니다 . Send MMS

문제는 Android v4.2.2의 Nexus 4 에서이 코드를 실행하려고 했는데이 오류가 발생한다는 것입니다.

java.lang.SecurityException: No permission to write APN settings: Neither user 10099 nor current process has android.permission.WRITE_APN_SETTINGS.

클래스 CarriersgetMMSApns()메소드 에서 ContentProvider를 조회 한 후 오류가 발생 합니다 APNHelper.

final Cursor apnCursor = this.context.getContentResolver().query(Uri.withAppendedPath(Carriers.CONTENT_URI, "current"), null, null, null, null);

분명히 Android 4.2에서 APN을 읽을 수 없습니다

모바일 데이터를 사용하여 MMS 전송과 같은 작업을 수행하고 장치에있는 기본 APN 설정을 모르는 모든 응용 프로그램의 대안은 무엇입니까?

업데이트 # 4

MMS 전송

이 예제를 따라 해 보았습니다. Send MMS

@ Sam이 그의 대답에서 제안한 것처럼 :

You have to add jsoup to the build path, the jar to the build path and import com.droidprism.*; To do that in android, add the jars to the libs directory first, then configure the project build path to use the jars already in the libs directory, then on the build path config click order and export and check the boxes of the jars and move jsoup and droidprism jar to the top of the build order.

이제 더 이상 SecurityException 오류가 발생하지 않습니다. Android KitKat의 Nexus 5에서 테스트 중입니다. 샘플 코드를 실행 한 후 호출 후 200 응답 코드가 표시됩니다.

MMResponse mmResponse = sender.send(out, isProxySet, MMSProxy, MMSPort);

그러나 MMS를 보내려는 사람에게 확인했습니다. 그리고 그들은 MMS를받지 못했다고 말했습니다.


전에이 튜토리얼을 살펴 보셨습니까? maximbogatov.wordpress.com/2011/08/13/mms-in-android
HaemEternal

3
네, 있어요. Maxim의 답변을 함께 정리하려고 시도했지만 제대로 작동하지 않습니다. 거기에 더 이상 사용되지 않는 android.provider.telephony를 가져 오는 많은 클래스가 있습니다.
toobsco42

아마도
@Sahil

@Sahil의 답변과 매우 비슷해 보이지만 그 대답을 함께 만드는 방법을 잘 모르겠습니다.
toobsco42

안녕하세요 @ toobsco42 당신은 위에서 언급 한 모든 쿼리에 대한 솔루션을 찾을 수 있습니다 ..?
kamal_tech_view

답변:


15

위에서 설명한 것과 동일한 문제가 있습니다 (t-mobile USA의 Galaxy Nexus). 모바일 데이터가 꺼져 있기 때문입니다.

Jelly Bean에서 설정> 데이터 사용량> 모바일 데이터

MMS를 전송하거나 수신하기 전에 모바일 데이터를 설정해야합니다. 모바일 데이터가 꺼진 상태에서 MMS를 수신하면 새 메시지 알림을 받고 다운로드 버튼이있는 메시지를받습니다. 그러나 이전에 모바일 데이터가 없으면 들어오는 MMS 첨부 파일이 수신되지 않습니다. 메시지가 수신 된 후 켜도 마찬가지입니다.

어떤 이유로 전화 제공 업체가 MMS를 보내고받을 수있는 기능을 제공하는 경우 Wifi를 사용하는 경우에도 모바일 데이터를 활성화해야합니다. 모바일 데이터를 활성화하면 MMS를 받고 보낼 수 있습니다. Wi-Fi가 기기에서 인터넷으로 표시되고 있습니다.

켜져 있지 않은 것처럼 모바일 데이터를 켤 때에도 메시지가 많이 중단 될 수 있으며 장치를 다시 부팅해야 할 수도 있습니다.


또한 SMS 및 MMS 전송은 백그라운드에서 완전히 다른 두 가지라는 것을 알아야합니다. MMS는 텍스트와 함께 추가 항목 (미디어)을 보내야하므로 인터넷 기반 네트워크 서비스에 가깝습니다. 주어진 코드는 내가 테스트 한 일부 장치에서 제대로 작동합니다. ps : NOKIA 부분을 무시할 수 있습니다.
Manan Sharma

이 예제를 실행하면 LogCat에서 다음과 같이 인쇄됩니다. 02-24 13 : 32 : 40.872 : V / SendMMSActivity (5686) : TYPE_MOBILE_MMS가 연결되지 않았습니다. TYPE_MOBILE_MMS, bail이 아니라 : java.lang.SecurityException : APN 설정을 쓸 수있는 권한이 없음 : 사용자 10099 또는 현재 프로세스 모두 android.permission.WRITE_APN_SETTINGS가 없습니다. 이 쿼리를 실행할 수없는 것 같습니다 : final Cursor apnCursor = this.context.getContentResolver (). query (Uri.withAppendedPath (Carriers.CONTENT_URI, "current"), null, null, null, null); Nexus 4에서 테스트 중입니다.
toobsco42

또한 이것은 @Sahil이 제공 한 것과 동일한 예입니다.
toobsco42

7

공식 API 지원은 없습니다. 이는 대중에게 문서화되지 않았으며 라이브러리는 언제든지 변경 될 수 있음을 의미합니다. 신청서를 남기고 싶지 않다는 것을 알고 있지만 다른 사람이 궁금해하는 의도로 신청서를 작성하는 방법은 다음과 같습니다.

public void sendData(int num){
    String fileString = "..."; //put the location of the file here
    Intent mmsIntent = new Intent(Intent.ACTION_SEND);
    mmsIntent.putExtra("sms_body", "text");
    mmsIntent.putExtra("address", num);
    mmsIntent.putExtra(Intent.EXTRA_STREAM, Uri.fromFile(new File(fileString)));
    mmsIntent.setType("image/jpeg");
    startActivity(Intent.createChooser(mmsIntent, "Send"));

}

메시지 전달 추적과 같은 작업을 수행하는 방법을 완전히 파악하지 못했지만 메시지를 보내야합니다.

SMS와 같은 방식으로 mms를 수신하라는 알림을받을 수 있습니다. 수신자의 의도 필터는 다음과 같아야합니다.

<intent-filter>
    <action android:name="android.provider.Telephony.WAP_PUSH_RECEIVED" />
    <data android:mimeType="application/vnd.wap.mms-message" />
</intent-filter>

기본 메시징 앱만 시작하지 않습니까?
toobsco42

1
그래 미안해 방금 당신이 이미 그 방법을 알고 있다는 것을 깨달았습니다. 그래도 mms를받는 방법을 추가했습니다.
user1959417

감사합니다. 최근에 MMS의 일부를 구현 BroadcastReceiver하고 Intent Filter있으며 게시 한 것을 사용 했습니다. 이 질문을 곧 업데이트하겠습니다.
toobsco42

4

apn 설정을 쓸 수있는 권한없이 Android 4.0 api 14 이상에 대해 mms를 보내려면 이 라이브러리를 사용할 수 있습니다 . android에서 mnc 및 mcc 코드를 검색 한 후 전화

Carrier c = Carrier.getCarrier(mcc, mnc);
if (c != null) {
    APN a = c.getAPN();
    if (a != null) {
        String mmsc = a.mmsc;
        String mmsproxy = a.proxy; //"" if none
        int mmsport = a.port; //0 if none
    }
}

이를 사용하려면 Jsoup 및 droid prism jar을 빌드 경로에 추가하고 import com.droidprism. *;


안녕하세요 @Sam, .jar 파일을 프로젝트에 추가했지만 Carrier 객체를 인스턴스화하는 줄 에이 오류 java.lang.NoClassDefFoundError: com.droidprism.Carrier 가 발생합니다.
toobsco42

아니. 빌드 경로에 jsoup을 추가하고 jar를 빌드 경로에 추가하고 import com.droidprism. *; 답을 편집하겠습니다. 안드로이드에서 항아리를 추가하려면 먼저 libs 디렉토리에 항아리를 추가 한 다음 libs 디렉토리에 이미있는 항아리를 사용하도록 프로젝트 빌드 경로를 구성 한 다음 빌드 경로 구성에서 순서를 클릭하고 항아리의 상자를 내보내고 확인하십시오. jsoup 및 droidprism jar을 빌드 순서의 맨 위에 놓습니다.
Sam Adamsh

Jsoup .jar를 추가하면 NoClassDefFoundError가 해결되었습니다. 이제 APN 설정을 얻을 수 있습니다. 다음 단계는 MMS를 보내는 방법을 알아내는 것입니다.
toobsco42

3

안드로이드에서 mms를 보내기위한 SDK 지원이 없다고 생각합니다. 내가 아직 찾지 못한 Atleast를 보십시오 . 그러나 한 남자가 그것을 가지고 있다고 주장했다. 이 게시물을 살펴보십시오.

안드로이드의 내 응용 프로그램에서 MMS 보내기


Nokia 구현의 androidbridge.blogspot.com 게시물에 대한 의견을 살펴 보았으며 많은 사람들이 기기에서 작동하는 데 문제가있는 것처럼 보입니다.
toobsco42

@ toobsco42 따라서 아직 지원되지 않을 수 있습니다.
Sahil Mahajan Mj

-2

나는 좌절감을 이해하지 못한다. 이 의도를 필터링하는 브로드 캐스트 리시버를 만드는 것이 어떻습니까?

android.provider.Telephony.MMS_RECEIVED

좀 더 확인한 결과 이것을 얻으려면 시스템 수준의 액세스 권한이 필요할 수 있습니다 (루팅 된 전화).


3
안녕하세요 @ j2emanue, 문제는이 의도를받은 후 실제로 MMS의 내용을 어떻게 얻습니까? MMS에 이미지와 텍스트가 포함되어 있으면 이러한 구성 요소를 어떻게 추출합니까?
toobsco42

그러나 나는 당신이 그것을 할 수있는 여분의 바이트 배열이 있음을 알았습니다. .i 언급 .... byte [] data = intent.getByteArrayExtra ( "data"); 죄송하지만 구문 분석 방법을 잘 모르겠습니다.
j2emanue 2018

구문 분석 할 수 있습니다. 그러나 내가 얻을 수있는 것은 mms의 대상과 mms의 내용이 저장되는 contentlocation입니다. 그러나이 URL에 액세스 할 수 없습니다.
toobsco42

-2

SmsListenerClass

public class SmsListener extends BroadcastReceiver {

static final String ACTION =
        "android.provider.Telephony.SMS_RECEIVED";

@Override
public void onReceive(Context context, Intent intent) {

    Log.e("RECEIVED", ":-:-" + "SMS_ARRIVED");

    // TODO Auto-generated method stub
    if (intent.getAction().equals(ACTION)) {

        Log.e("RECEIVED", ":-" + "SMS_ARRIVED");

        StringBuilder buf = new StringBuilder();
        Bundle bundle = intent.getExtras();
        if (bundle != null) {

            Object[] pdus = (Object[]) bundle.get("pdus");

            SmsMessage[] messages = new SmsMessage[pdus.length];
            SmsMessage message = null;

            for (int i = 0; i < messages.length; i++) {

                if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
                    String format = bundle.getString("format");
                    messages[i] = SmsMessage.createFromPdu((byte[]) pdus[i], format);
                } else {
                    messages[i] = SmsMessage.createFromPdu((byte[]) pdus[i]);
                }

                message = messages[i];
                buf.append("Received SMS from  ");
                buf.append(message.getDisplayOriginatingAddress());
                buf.append(" - ");
                buf.append(message.getDisplayMessageBody());
            }

            MainActivity inst = MainActivity.instance();
            inst.updateList(message.getDisplayOriginatingAddress(),message.getDisplayMessageBody());

        }

        Log.e("RECEIVED:", ":" + buf.toString());

        Toast.makeText(context, "RECEIVED SMS FROM :" + buf.toString(), Toast.LENGTH_LONG).show();

    }
}

활동

@Override
public void onStart() {
    super.onStart();
    inst = this;
}

public static MainActivity instance() {
    return inst;
}

public void updateList(final String msg_from, String msg_body) {

    tvMessage.setText(msg_from + " :- " + msg_body);

    sendSMSMessage(msg_from, msg_body);

}

protected void sendSMSMessage(String phoneNo, String message) {

    try {
        SmsManager smsManager = SmsManager.getDefault();
        smsManager.sendTextMessage(phoneNo, null, message, null, null);
        Toast.makeText(getApplicationContext(), "SMS sent.", Toast.LENGTH_LONG).show();
    } catch (Exception e) {
        Toast.makeText(getApplicationContext(), "SMS faild, please try again.", Toast.LENGTH_LONG).show();
        e.printStackTrace();
    }
}

명백한

<uses-permission android:name="android.permission.RECEIVE_SMS"/>
<uses-permission android:name="android.permission.READ_SMS" />
<uses-permission android:name="android.permission.SEND_SMS"/>

<receiver android:name=".SmsListener">
        <intent-filter>
            <action android:name="android.provider.Telephony.SMS_RECEIVED" />
        </intent-filter>
    </receiver>
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.