การส่งและรับ SMS และ MMS ใน Android (ก่อน Kit Kat Android 4.4)


131

ฉันได้หาวิธีส่งและรับข้อความ SMS แล้ว ในการส่งข้อความ SMS ฉันต้องโทรไปที่sendTextMessage()และ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ไปยังแอปพลิเคชัน Messaging ดั้งเดิม ฉันพยายามส่ง MMS โดยไม่ต้องออกจากแอปพลิเคชัน ดูเหมือนจะไม่มีวิธีมาตรฐานในการส่งและรับ MMS มีใครได้รับสิ่งนี้ไปทำงานบ้าง?

นอกจากนี้ฉันทราบว่า SMS / MMS ContentProvider ไม่ได้เป็นส่วนหนึ่งของ Android SDK อย่างเป็นทางการ แต่ฉันคิดว่าอาจมีใครบางคนสามารถใช้สิ่งนี้ได้ ความช่วยเหลือใด ๆ ที่ได้รับการชื่นชมอย่างมาก

ปรับปรุง

ฉันได้เพิ่ม a BroadcastReceiverลงในAndroidManifest.xmlไฟล์เพื่อรับข้อความ 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>

ในคลาส 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 :

Broadcast Action: อุปกรณ์ได้รับข้อความ SMS ตามข้อความใหม่ ความตั้งใจจะมีค่าพิเศษดังต่อไปนี้:

pdus- เป็นObject[]ของbyte[]s มี PDUs ที่ทำขึ้นข้อความ

สามารถแยกค่าพิเศษโดยใช้getMessagesFromIntent(android.content.Intent) If a BroadcastReceiver พบข้อผิดพลาดขณะประมวลผลเจตนานี้ควรตั้งค่ารหัสผลลัพธ์ให้เหมาะสม

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

Broadcast Action: อุปกรณ์ได้รับข้อความ SMS ตามข้อมูลใหม่ ความตั้งใจจะมีค่าพิเศษดังต่อไปนี้:

pdus- เป็นObject[]ของbyte[]s มี PDUs ที่ทำขึ้นข้อความ

สามารถแยกค่าพิเศษได้โดยใช้ getMessagesFromIntent (android.content.Intent) หาก BroadcastReceiver พบข้อผิดพลาดขณะประมวลผลเจตนานี้ควรตั้งค่ารหัสผลลัพธ์ให้เหมาะสม

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

Broadcast Action: อุปกรณ์ได้รับข้อความ WAP PUSH ใหม่ ความตั้งใจจะมีค่าพิเศษดังต่อไปนี้:

transactionId (Integer) - รหัสธุรกรรม WAP

pduType (Integer) - ประเภท WAP PDU`

header (byte[]) - ส่วนหัวของข้อความ

data (byte[]) - ส่วนข้อมูลของข้อความ

contentTypeParameters (HashMap<String,String>) - พารามิเตอร์ใด ๆ ที่เกี่ยวข้องกับประเภทเนื้อหา (ถอดรหัสจากส่วนหัว WSP Content-Type)

หาก BroadcastReceiver พบข้อผิดพลาดขณะประมวลผลเจตนานี้ควรตั้งค่ารหัสผลลัพธ์ให้เหมาะสม ค่าพิเศษ contentTypeParameters คือการแม็พพารามิเตอร์เนื้อหาที่คีย์ด้วยชื่อ หากพบพารามิเตอร์ที่ไม่ได้กำหนดใด ๆ ที่รู้จักกันดีคีย์ของแผนที่จะเป็น 'unassigned / 0x ... ' โดยที่ '... ' คือค่าฐานสิบหกของพารามิเตอร์ที่ไม่ได้กำหนด หากพารามิเตอร์ไม่มีค่าค่าในแผนที่จะเป็นค่าว่าง

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

อัปเดต # 2

ฉันได้หาวิธีส่งผ่านความพิเศษใน a PendingIntentที่จะได้รับโดย a BroadcastReceiver: Android PendingIntent extras ที่ BroadcastReceiver ไม่ได้รับ

แต่พิเศษที่ได้รับการส่งผ่านไปยังSendBroadcastReceiverไม่SMSReceiver ฉันจะส่งข้อความพิเศษไปยังSMSReceiver ได้อย่างไร?

อัปเดต # 3

การรับ MMS

ดังนั้นหลังจากทำการค้นคว้าเพิ่มเติมฉันเห็นคำแนะนำในการลงทะเบียนไฟล์ContentObserver. ด้วยวิธีนี้คุณสามารถตรวจจับได้เมื่อมีการเปลี่ยนแปลงใด ๆ ในcontent://mms-sms/conversationsContent Provider ดังนั้นจึงช่วยให้คุณตรวจจับ MMS ที่เข้ามา นี่คือตัวอย่างที่ใกล้เคียงที่สุดที่จะทำให้สิ่งนี้ทำงานได้: การรับ MMS

แต่มีตัวแปรประเภทmainActivity ชั้นเรียนServiceControllerอยู่ที่ไหนServiceController? มีการใช้งานอื่น ๆ ของการจดทะเบียนContentObserverหรือไม่?

การส่ง MMS

สำหรับการส่ง MMS ฉันเจอตัวอย่างนี้: ส่ง MMS

ปัญหาคือฉันพยายามเรียกใช้รหัสนี้บน Nexus 4 ซึ่งอยู่บน Android v4.2.2 และฉันได้รับข้อผิดพลาดนี้:

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

ข้อผิดพลาดเกิดขึ้นหลังจากสอบถามCarriersContentProvider ในgetMMSApns()วิธีการของAPNHelperคลาส

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

เห็นได้ชัดว่าคุณไม่สามารถอ่าน APN ใน Android 4.2

ทางเลือกอื่นสำหรับแอปพลิเคชันทั้งหมดที่ใช้ข้อมูลมือถือเพื่อดำเนินการ (เช่นการส่ง MMS) และไม่ทราบการตั้งค่า APN เริ่มต้นที่มีอยู่ในอุปกรณ์คืออะไร

อัปเดต # 4

การส่ง MMS

ฉันได้ลองทำตามตัวอย่างนี้แล้ว: ส่ง 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 อีกต่อไป ตอนนี้ฉันกำลังทดสอบ Nexus 5 บน Android KitKat หลังจากเรียกใช้โค้ดตัวอย่างมันจะให้รหัสตอบกลับ 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 แล้วคุณได้ลองสิ่งนี้ด้วย: stackoverflow.com/questions/2972845/…
HaemEternal

ฉันไม่แน่ใจว่าจะปะติดปะต่อคำตอบนั้นเข้าด้วยกันได้อย่างไรแม้ว่ามันจะดูคล้ายกับคำตอบของ @ Sahil มากก็ตาม
toobsco42

สวัสดี @ toobsco42 คุณสามารถค้นหาวิธีแก้ปัญหาสำหรับคำถามทั้งหมดที่คุณกล่าวถึงข้างต้นได้หรือไม่ .. ?
kamal_tech_view

คำตอบ:


15

ฉันมีปัญหาเดียวกันกับที่คุณอธิบายไว้ข้างต้น (Galaxy Nexus บน t-mobile USA) เป็นเพราะข้อมูลมือถือถูกปิด

ใน Jelly Bean คือการตั้งค่า> การใช้ข้อมูล> ข้อมูลมือถือ

โปรดทราบว่าฉันต้องเปิดข้อมูลมือถือไว้ก่อนจึงจะส่ง MMS หรือรับได้ หากฉันได้รับ MMS โดยปิดข้อมูลมือถือฉันจะได้รับการแจ้งเตือนข้อความใหม่และฉันจะได้รับข้อความพร้อมปุ่มดาวน์โหลด แต่ถ้าฉันไม่มีข้อมูลมือถือก่อนหน้านี้จะไม่ได้รับไฟล์แนบ MMS ที่เข้ามา แม้ว่าฉันจะเปิดใช้งานหลังจากได้รับข้อความแล้วก็ตาม

ด้วยเหตุผลบางประการเมื่อผู้ให้บริการโทรศัพท์ของคุณอนุญาตให้คุณสามารถส่งและรับ MMS ได้คุณจะต้องเปิดใช้งานข้อมูลมือถือแม้ว่าคุณจะใช้ Wifi หากเปิดใช้งานข้อมูลมือถือคุณจะสามารถรับและส่ง MMS ได้แม้ว่า Wifi แสดงเป็นอินเทอร์เน็ตบนอุปกรณ์ของคุณ

เป็นความเจ็บปวดอย่างแท้จริงราวกับว่าคุณไม่ได้เปิดใช้งานข้อความอาจค้างได้มากแม้ว่าจะเปิดข้อมูลมือถือและอาจต้องรีบูตอุปกรณ์


นอกจากนี้คุณต้องทราบด้วยว่าการส่ง SMS และ MMS นั้นมี 2 สิ่งที่แตกต่างกันอย่างสิ้นเชิง MMS เป็นบริการเครือข่ายที่ใช้อินเทอร์เน็ตมากกว่าเนื่องจากต้องส่งรายการเพิ่มเติม (สื่อ) พร้อมข้อความ รหัสที่ระบุใช้งานได้ดีกับอุปกรณ์บางอย่างที่ฉันเคยทดสอบ ps: คุณสามารถเพิกเฉยต่อส่วนของ NOKIA ได้
Manan Sharma

เมื่อฉันเรียกใช้ตัวอย่างนี้ใน LogCat จะพิมพ์: 02-24 13: 32: 40.872: V / SendMMSActivity (5686): ไม่ได้เชื่อมต่อ TYPE_MOBILE_MMS ประกันตัว 02-24 13: 32: 40.882: V / SendMMSActivity (5686): type is ไม่ใช่ TYPE_MOBILE_MMS ประกันตัวนอกจากนี้ยังระบุว่า: java.lang.SecurityException: ไม่มีสิทธิ์ในการเขียนการตั้งค่า APN: ทั้งผู้ใช้ 10099 หรือกระบวนการปัจจุบันไม่มี android.permission.WRITE_APN_SETTINGS ดูเหมือนว่าจะไม่สามารถเรียกใช้แบบสอบถามนี้ได้: สุดท้าย 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"));

}

ฉันยังไม่ทราบวิธีการทำสิ่งต่างๆเช่นติดตามการส่งข้อความ แต่ควรส่งให้

คุณสามารถแจ้งเตือนการรับ mms ได้เช่นเดียวกับ sms ตัวกรองเจตนาบนเครื่องรับควรมีลักษณะดังนี้

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

สิ่งนี้ไม่ได้เพิ่งเปิดตัวแอพ Messaging ดั้งเดิมใช่ไหม
toobsco42

1
ใช่ขอโทษเกี่ยวกับเรื่องนั้น ฉันเพิ่งรู้ว่าคุณรู้แล้วว่าต้องทำอย่างไร ฉันได้เพิ่มวิธีรับ mms แล้ว
user1959417

ขอบคุณฉันเพิ่งใช้งานบางส่วนของ MMS BroadcastReceiverและได้ใช้Intent Filterที่คุณโพสต์ไว้ ฉันจะอัปเดตคำถามนี้เร็ว ๆ นี้
toobsco42

4

ในการส่ง mms สำหรับ Android 4.0 api 14 หรือสูงกว่าโดยไม่ได้รับอนุญาตให้เขียนการตั้งค่า apn คุณสามารถใช้ไลบรารีนี้ : ดึงรหัส mnc และ mcc จาก android จากนั้นโทร

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 ลงใน build path และนำเข้า com.droidprism. *;


เฮ้ @ แซมฉันเพิ่มไฟล์. jar ลงในโปรเจ็กต์ของฉัน แต่ได้รับข้อผิดพลาดนี้ที่บรรทัดที่อินสแตนซ์อ็อบเจ็กต์ Carrier: java.lang.NoClassDefFoundError: com.droidprism.Carrier นั่นเกิดขึ้นกับคุณหรือไม่?
toobsco42

ไม่ คุณต้องเพิ่ม jsoup ใน build path, jar ไปยัง build path และ import com.droidprism. *; ฉันจะแก้ไขคำตอบ ในการทำเช่นนั้นใน Android ให้เพิ่มไหลงในไดเร็กทอรี libs ก่อนจากนั้นกำหนดค่าเส้นทางการสร้างโปรเจ็กต์เพื่อใช้ไหที่มีอยู่แล้วในไดเร็กทอรี libs จากนั้นในลำดับการคลิกการกำหนดค่าเส้นทางการสร้างและส่งออกและทำเครื่องหมายที่ช่องของไหและย้าย jsoup และ droidprism jar ไปที่ด้านบนสุดของคำสั่งสร้าง
Sam Adamsh

การเพิ่ม Jsoup .jar แก้ปัญหา NoClassDefFoundError ตอนนี้ฉันสามารถรับการตั้งค่า APN ได้แล้ว ขั้นตอนต่อไปคือการหาวิธีส่ง MMS
toobsco42

3

ฉันไม่คิดว่าจะมีการรองรับ sdk สำหรับการส่ง mms ใน Android ดูที่นี่อย่างน้อยฉันยังไม่พบ แต่ผู้ชายคนหนึ่งอ้างว่ามีมัน ลองดูที่โพสต์นี้

ส่ง MMS จากแอปพลิเคชันของฉันใน Android


ฉันดูความคิดเห็นของโพสต์ androidbridge.blogspot.com เกี่ยวกับการใช้งาน Nokia และดูเหมือนว่าหลายคนกำลังมีปัญหาในการทำให้สิ่งนี้ทำงานบนอุปกรณ์ของตน
toobsco42

@ toobsco42 ดังนั้นอาจจะยังไม่รองรับ
Sahil Mahajan Mj

-2

ฉันไม่เข้าใจความผิดหวัง ทำไมไม่เพียงแค่สร้างตัวรับสัญญาณที่กรองจุดประสงค์นี้:

android.provider.Telephony.MMS_RECEIVED

ฉันตรวจสอบเพิ่มเติมเล็กน้อยและคุณอาจต้องเข้าถึงระดับระบบเพื่อรับสิ่งนี้ (โทรศัพท์ที่รูท)


3
เฮ้ @ j2emanue ปัญหาคือหลังจากที่คุณได้รับความตั้งใจนี้คุณจะได้รับเนื้อหาของ MMS ได้อย่างไร? หาก MMS ประกอบด้วยรูปภาพและข้อความคุณจะแยกส่วนประกอบเหล่านี้ได้อย่างไร
toobsco42

แต่ฉันสังเกตเห็นว่ามีอาร์เรย์ไบต์พิเศษที่คุณจะได้รับหากคุณทำตามที่ฉันกล่าวถึง .... byte [] data = Intent.getByteArrayExtra ("data"); ฉันไม่แน่ใจว่าจะแยกวิเคราะห์อย่างไรแม้ว่าขออภัย
j2emanue

ฉันสามารถแยกวิเคราะห์ได้ แต่สิ่งที่ฉันได้รับคือเรื่องที่มาของ mms และตำแหน่งเนื้อหาที่เก็บเนื้อหาของ mms อย่างไรก็ตามไม่สามารถเข้าถึง 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.