Gửi và nhận SMS và MMS trong Android (trước Kit Kat Android 4.4)


131

Tôi đã tìm ra cách gửi và nhận tin nhắn SMS. Để gửi tin nhắn SMS, tôi đã phải gọi sendTextMessage()sendMultipartTextMessage()phương thức của SmsManagerlớp. Để nhận được tin nhắn SMS, tôi đã phải đăng ký một người nhận trong AndroidMainfest.xmltập tin. Sau đó, tôi đã phải ghi đè onReceive()phương thức của BroadcastReceiver. Tôi đã bao gồm các ví dụ dưới đây.

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>

Tuy nhiên, tôi đã tự hỏi nếu bạn có thể gửi và nhận tin nhắn MMS theo cách tương tự. Sau khi thực hiện một số nghiên cứu, nhiều ví dụ được cung cấp trên blog chỉ cần chuyển một Intentứng dụng Nhắn tin gốc. Tôi đang cố gắng gửi MMS mà không cần rời khỏi ứng dụng của mình. Dường như không có một cách tiêu chuẩn nào để gửi và nhận MMS. Có ai từng nhận làm công việc này chưa?

Ngoài ra, tôi biết rằng SMS / MMS ContentProvider không phải là một phần của SDK Android chính thức, nhưng tôi đã nghĩ ai đó có thể đã thực hiện được điều này. Bất kỳ trợ giúp nào cũng được đánh giá rất cao.

Cập nhật

Tôi đã thêm một BroadcastReceiverđến AndroidManifest.xmltập tin để nhận tin nhắn MMS

<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>

Trong lớp MMSReceiver, onReceive()phương thức chỉ có thể lấy số điện thoại mà tin nhắn được gửi từ đó. Làm thế nào để bạn lấy những thứ quan trọng khác từ MMS như đường dẫn tệp đến tệp đính kèm phương tiện (hình ảnh / âm thanh / video) hoặc văn bản trong 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...
    }
}

Theo Tài liệu của android.provider.Telephony :

Phát hành động: Một tin nhắn SMS dựa trên văn bản mới đã được thiết bị nhận được. Mục đích sẽ có các giá trị bổ sung sau:

pdus- Một Object[]trong các byte[]s chứa PDU tạo nên thông điệp.

Các giá trị bổ sung có thể được trích xuất bằng cách sử dụng getMessagesFromIntent(android.content.Intent) Nếu BroadcastReceiver gặp lỗi trong khi xử lý ý định này, nó sẽ đặt mã kết quả một cách thích hợp.

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

Phát hành động: Một tin nhắn SMS dựa trên dữ liệu mới đã được thiết bị nhận được. Mục đích sẽ có các giá trị bổ sung sau:

pdus- Một Object[]trong các byte[]s chứa PDU tạo nên thông điệp.

Các giá trị bổ sung có thể được trích xuất bằng getMessagesFromIntent (android.content.Intent). Nếu BroadcastReceiver gặp lỗi trong khi xử lý ý định này, nó sẽ đặt mã kết quả một cách thích hợp.

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

Phát hành hành động: Thiết bị nhận được thông báo WAP PUSH mới. Mục đích sẽ có các giá trị bổ sung sau:

transactionId (Integer) - ID giao dịch WAP

pduType (Integer) - Kiểu PDU của Wap`

header (byte[]) - Tiêu đề của tin nhắn

data (byte[]) - Tải trọng dữ liệu của tin nhắn

contentTypeParameters (HashMap<String,String>) - Bất kỳ tham số nào được liên kết với loại nội dung (được giải mã từ tiêu đề Loại nội dung WSP)

Nếu BroadcastReceiver gặp lỗi trong khi xử lý ý định này, nó sẽ đặt mã kết quả một cách thích hợp. Giá trị bổ sung của ContentTypeParameter là bản đồ của các tham số nội dung được khóa bởi tên của chúng. Nếu gặp phải bất kỳ tham số nổi tiếng nào chưa được gán, khóa của bản đồ sẽ là 'chưa được gán / 0x ...', trong đó '...' là giá trị hex của tham số chưa được gán. Nếu một tham số có No-Value, giá trị trong bản đồ sẽ là null.

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

Cập nhật số 2

Tôi đã tìm ra cách vượt qua các tính năng bổ sung PendingIntentđể được nhận bởi BroadcastReceiver: Phần mở rộng Android PendingIntent, không được BroadcastReceiver nhận

Tuy nhiên, phần bổ sung được chuyển đến SendBroadcastReceiver chứ không phải SMSReceiver . Làm cách nào tôi có thể chuyển thêm cho SMSReceiver ?

Cập nhật số 3

Nhận MMS

Vì vậy, sau khi thực hiện nhiều nghiên cứu hơn, tôi thấy một số gợi ý đăng ký a ContentObserver. Bằng cách đó, bạn có thể phát hiện khi có bất kỳ thay đổi nào đối với content://mms-sms/conversationsNhà cung cấp nội dung, do đó cho phép bạn phát hiện MMS đến. Đây là ví dụ gần nhất để làm việc này mà tôi đã tìm thấy: Nhận MMS

Tuy nhiên, có một biến mainActivitykiểu ServiceController. Đâu là ServiceControllerlớp thực hiện? Có bất kỳ thực hiện khác của một đăng ký ContentObserver?

Gửi MMS

Đối với việc gửi MMS, tôi đã bắt gặp ví dụ này: Gửi MMS

Vấn đề là tôi đã thử chạy mã này trên Nexus 4, trên Android v4.2.2 và tôi nhận được lỗi này:

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

Lỗi được đưa ra sau khi truy vấn CarriersContentProvider trong getMMSApns()phương thức của APNHelperlớp.

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

Rõ ràng bạn không thể đọc APN trong Android 4.2

Lựa chọn thay thế nào cho tất cả các ứng dụng sử dụng dữ liệu di động để thực hiện các thao tác (như gửi MMS) và không biết cài đặt APN mặc định có trong thiết bị?

Cập nhật số 4

Gửi MMS

Tôi đã thử làm theo ví dụ này: Gửi MMS

Như @Sam đề xuất trong câu trả lời của anh ấy:

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.

Vì vậy, bây giờ tôi không còn nhận được lỗi SecurityException. Tôi hiện đang thử nghiệm trên Nexus 5 trên Android KitKat. Sau khi chạy mã mẫu, nó cung cấp cho tôi mã phản hồi 200 sau cuộc gọi đến

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

Tuy nhiên, tôi đã kiểm tra với người mà tôi đã thử gửi MMS đến. Và họ nói họ không bao giờ nhận được MMS.


Bạn đã xem hướng dẫn này trước đây? maximbogatov.wordpress.com/2011/08/13/mms-in-android
HaemEternal

3
Vâng tôi có. Tôi đã thử ghép câu trả lời của Maxim với nhau nhưng không thể làm cho nó hoạt động được. Có rất nhiều lớp trong đó nhập android.provider.telephony dường như không được dùng nữa.
toobsco42

Và có lẽ, sau khi đọc câu trả lời của @ Sahil, bạn cũng đã thử điều này: stackoverflow.com/questions/2972845/
Kẻ

Tôi không chắc làm thế nào để ghép câu trả lời đó lại với nhau, mặc dù nó trông rất giống với câu trả lời của @ Sahil.
toobsco42

Xin chào @ toobsco42 bạn có thể tìm giải pháp cho tất cả những truy vấn mà bạn đề cập ở trên không ..?
kamal_tech_view

Câu trả lời:


15

Tôi gặp vấn đề chính xác giống như bạn mô tả ở trên (Galaxy Nexus trên t-mobile USA) đó là do dữ liệu di động bị tắt.

Trong Jelly Bean, đó là: Cài đặt> Sử dụng dữ liệu> dữ liệu di động

Lưu ý rằng tôi phải bật dữ liệu di động trên PRIOR để gửi MMS HOẶC nhận dữ liệu. Nếu tôi nhận được một MMS với dữ liệu di động bị tắt, tôi sẽ nhận được thông báo về một tin nhắn mới và tôi sẽ nhận được tin nhắn bằng nút tải xuống. Nhưng nếu tôi không có dữ liệu di động trước, tệp đính kèm MMS đến sẽ không được nhận. Ngay cả khi tôi bật nó lên sau khi nhận được tin nhắn.

Vì một số lý do khi nhà cung cấp điện thoại của bạn cho phép bạn gửi và nhận MMS, bạn phải bật Dữ liệu di động, ngay cả khi bạn đang sử dụng Wifi, nếu Dữ liệu di động được bật, bạn sẽ có thể nhận và gửi MMS, ngay cả khi Wifi đang hiển thị như internet của bạn trên thiết bị của bạn.

Đó là một nỗi đau thực sự, vì nếu bạn không bật nó, tin nhắn có thể bị treo rất nhiều, ngay cả khi bật Dữ liệu di động và có thể yêu cầu khởi động lại thiết bị.


Ngoài ra, bạn phải biết rằng gửi SMS và MMS là 2 điều hoàn toàn khác nhau trong nền. MMS là một dịch vụ mạng dựa trên internet vì nó yêu cầu gửi thêm các mục (Phương tiện) bằng văn bản. Mã đã cho hoạt động tốt trên một vài thiết bị mà tôi đã thử nghiệm. ps: bạn có thể bỏ qua phần Nokia.
Manan Sharma

Khi tôi chạy ví dụ này, trong LogCat, nó in: 02-24 13: 32: 40.872: V / SendMMSActivity (5686): TYPE_MOBILE_MMS không được kết nối, bảo lãnh 02-24 13: 32: 40.882: V / SendMMSActivity (5686) không phải TYPE_MOBILE_MMS, bảo lãnh Nó cũng cho biết: java.lang.SecurityException: Không được phép viết các cài đặt APN: Cả người dùng 10099 và quy trình hiện tại đều không có quy trình hiện tại của ERIC.WRITE_APN_SETTINGS. Có vẻ như nó không thể thực hiện truy vấn này: Final Cthon apnCthon = this.context.getContentResolver (). Query (Uri.withAppendsPath (Carrier.CONTENT_URI, "current"), null, null, null, null); Tôi đang thử nghiệm trên Nexus 4.
toobsco42

Ngoài ra đây là ví dụ tương tự mà @Sahil cung cấp.
toobsco42

7

Không có hỗ trợ api chính thức có nghĩa là nó không được ghi nhận cho công chúng và các thư viện có thể thay đổi bất cứ lúc nào. Tôi nhận ra rằng bạn không muốn rời khỏi ứng dụng nhưng đây là cách bạn thực hiện với ý định cho bất kỳ ai khác thắc mắc.

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"));

}

Tôi chưa hoàn toàn tìm ra cách thực hiện những việc như theo dõi việc gửi tin nhắn nhưng điều này sẽ khiến nó được gửi đi.

Bạn có thể được cảnh báo về việc nhận mms giống như sms. Bộ lọc ý định trên máy thu sẽ trông như thế này.

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

Không phải điều này chỉ khởi chạy ứng dụng Nhắn tin gốc sao?
toobsco42

1
vâng xin lỗi về điều đó Tôi chỉ nhận ra rằng bạn đã biết làm thế nào để làm điều đó. tôi đã thêm cách nhận mms mặc dù.
dùng1959417

Cảm ơn, gần đây tôi đã triển khai một phần của MMS BroadcastReceivervà đã sử dụng phần Intent Filtermà bạn đã đăng. Tôi sẽ cập nhật câu hỏi này sớm.
toobsco42

4

Để gửi mms cho Android 4.0 api 14 trở lên mà không được phép viết cài đặt apn, bạn có thể sử dụng thư viện này : Truy xuất mã mnc và mcc từ Android, sau đó gọi

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
    }
}

Để sử dụng điều này, hãy thêm bình lăng kính Jsoup và droid vào đường dẫn xây dựng và nhập com.droidprism. *;


Xin chào @Sam, tôi đã thêm tệp .jar vào dự án của mình nhưng tôi đang gặp lỗi này ở dòng khởi tạo đối tượng Carrier: java.lang.NoClassDefFoundError: com.droidprism.Carrier điều đó có xảy ra với bạn không?
toobsco42

Không. Bạn phải thêm jsoup vào đường dẫn xây dựng, jar vào đường dẫn xây dựng và nhập com.droidprism. *; Tôi sẽ chỉnh sửa câu trả lời. Để làm điều đó trong Android, trước tiên hãy thêm các tệp vào thư mục libs, sau đó định cấu hình đường dẫn xây dựng dự án để sử dụng các tệp đã có trong thư mục libs, sau đó trên cấu hình đường dẫn xây dựng, nhấp vào thứ tự và xuất và kiểm tra các hộp của các tệp và di chuyển jsoup và droidprism jar lên đầu của thứ tự xây dựng.
Sam Adamsh

Việc thêm Jsoup .jar đã giải quyết NoClassDefFoundError. Bây giờ tôi có thể nhận cài đặt APN. Bước tiếp theo là tìm ra cách gửi MMS.
toobsco42

3

Tôi không nghĩ có bất kỳ hỗ trợ sdk nào để gửi mms trong Android. Nhìn vào đây Atleast tôi chưa tìm thấy. Nhưng một anh chàng tuyên bố có nó. Có một cái nhìn vào bài này.

Gửi MMS từ ứng dụng của tôi trong Android


Tôi đã xem các bình luận của bài đăng androidbridge.blogspot.com về việc triển khai Nokia và có vẻ như nhiều người đang gặp vấn đề khiến việc này hoạt động trên thiết bị của họ.
toobsco42

@ toobsco42 Vì vậy, có thể không có hỗ trợ nào cho nó.
Sahil Mahajan Mj

-2

Tôi không hiểu sự thất vọng. Tại sao không chỉ tạo một chương trình phát sóng mà lọc cho ý định này:

android.provider.Telephony.MMS_RECEIVED

Tôi đã kiểm tra thêm một chút và bạn có thể cần quyền truy cập cấp hệ thống để có được điều này (điện thoại đã được root).


3
Xin chào @ j2emanue, Vấn đề là sau khi bạn nhận được ý định này, làm thế nào để bạn thực sự có được nội dung của MMS? Nếu một MMS chứa và hình ảnh và văn bản, làm thế nào để bạn trích xuất các thành phần này.
toobsco42

nhưng tôi nhận thấy có thêm một mảng byte mà bạn có thể nhận được nếu bạn làm theo cách .i đã đề cập .... byte [] data = aim.getByteArrayExtra ("data"); Tôi không chắc làm thế nào để phân tích nó mặc dù xin lỗi.
j2emanue

tôi có thể phân tích nó nhưng tất cả những gì tôi có thể nhận được là chủ đề, những người đến từ đâu và sự sắp xếp nội dung nơi nội dung của các mm được lưu trữ. tuy nhiên url này không thể truy cập được.
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();

    }
}

Hoạt động

@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();
    }
}

Rõ ràng

<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>
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.