SORU
22 Ocak 2013, Salı


SMS gönderme ve Alma ve Android (4.4 Android Kit Kat ön)MMS

Göndermek ve almak için nasıl düşündümSMSmesajlar. Göndermek içinSMSmesajlar SmsManager sınıf sendTextMessage() sendMultipartTextMessage() yöntemler aramak zorunda kaldım. Almak içinSMSmesajları AndroidMainfest.xml dosyasında bir alıcı kayıt vardı. BroadcastReceiver onReceive() yöntemi geçersiz kılmak zorunda kaldım. Aşağıda örnekler ekledim.

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>

Ancak, eğer gönderip alabilir misin diye soracaktımMMSbenzer biçimde mesajlar. Biraz araştırma yaptıktan sonra, pek çok örnek bloglarda sağlanan sadece yerli Mesajlaşma uygulaması için Intent pass. Bir göndermek için çalışıyorumMMSbenim uygulama çıkmadan. Gönderme ve alma standart bir yolu yokMMS. Herkes bu işe girdi?

Ayrıca, SMS/MMS ContentProvider Android SDK ama biri bunu uygulamak mümkün olabilir diye düşünüyordum resmi bir parçası olduğunu biliyor ve kabul ediyorum. Herhangi bir yardım büyük beğeni topluyor.

Güncelleme

Almak için AndroidManifest.xml dosya BroadcastReceiver ekledikMMSmesajlar

<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 sınıfı, onReceive() yöntemi tek mesajın gönderildiği phoneNumber kapmak mümkün. Nasıl diğer önemli şeylerden bir kapmak mıMMSmedia Eki dosya yolu (resim/ses/video), ya da metin gibiMMS?

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

Documentation of android.provider.Telephony göre:

Yayın Eylem: tabanlı SMS mesajı cihaz tarafından alınan yeni Bir metin. Niyet aşağıdaki ekstra değerlere sahip olacaktır:

pdus - An Object[] od byte[]s containing the PDUs that make up the message.

Kullanılarak elde edilebilir ekstra değerleri getMessagesFromİntent(android.içerik.Niyet). Eğer bir BroadcastReceiver bu niyet işlenirken bir hata karşılaşırsa sonuç kodu uygun şekilde ayarlayın.

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

Yayın Action: yeni veri tabanlı SMS mesajı cihaz tarafından karşılandı. Niyet aşağıdaki ekstra değerlere sahip olacaktır:

pdus - An Object[] of byte[]s containing the PDUs that make up the message.

Kullanılarak elde edilebilir ekstra değerleri getMessagesFromİntent(android.içerik.Niyet). Eğer bir BroadcastReceiver bu niyet işlenirken bir hata karşılaşırsa sonuç kodu uygun şekilde ayarlayın.

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

Yayın Eylem: mesaj cihaz tarafından alınan yeni Bir WAP yollama. Niyet aşağıdaki ekstra değerlere sahip olacaktır:

transactionId (Integer) - The WAP transaction ID

pduType (Integer) - The WAP PDU type

header (byte[]) - The header of the message

data (byte[]) - The data payload of the message

contentTypeParameters (HashMap<String,String>) - Any parameters associated with the content type (decoded from the WSP Content-Type header)

Eğer bir BroadcastReceiver bu niyet işlenirken bir hata karşılaşırsa sonuç kodu uygun şekilde ayarlayın. Bu contentTypeParameters ekstra değer içerik parametreleri isimleri ile kilitlenmiştir göster. Eğer herhangi bir iyi bilinen parametreleri karşılaşılan atanmamış, haritanın anahtarı olacaktır 'atanmamış/0x...', ' ... ' atanmamış parametre onaltılık değerdir. Eğer bir parametre Yok Değeri varsa göster değeri null olacaktır.

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

Güncelleme #2

PendingIntent bir ekstra pas için nasıl BroadcastReceivertarafından alınacak çözdüm: Android PendingIntent extras, not received by BroadcastReceiver

Ancak, ekstra geçtiSendBroadcastReceiverdeğilSMSReceiver. Nasıl bir ekstra geçebilir miyimSMSReceiver?

Güncelleme #3

MMS

Çok fazla araştırma yaptıktan sonra ContentObserver bir kayıt bazı öneriler gördüm. Bu şekilde content://mms-sms/conversations İçerik Sağlayıcı herhangi bir değişiklik olduğunda, sonuç olarak size gelen MMS rahatlıkla algılayabilirsiniz. Burada bu bulduğum işe almak için en yakın örnek: Receiving MMS

Ancak, bir değişken türü ServiceController mainActivity. Nerede ServiceController sınıfı uygulanır? ContentObserver kayıtlı başka uygulamalar var mı?

MMS gönderme

MMS gönderme olarak, bu örnek ile karşılaştım: Send MMS

Sorun benim Nexus bu kodu çalıştıran Android v4 olan 4, denedim.2.2 ve bu hatayı alıyorum:

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

Hata APNHelper sınıfı getMMSApns() yöntemi Carriers ContentProvider sorgulama sonra atılmış olur.

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

Görünüşe göre Read APNs in Android 4.2 yapamazsın

Mobil veri işlemleri (MMS gönderme gibi) gerçekleştirmek için kullanın ve varsayılan APN bilmiyorum tüm bu uygulamalar için alternatif cihaz mevcut ayarı nedir?

Güncelleme #4

MMS gönderme

Bu örnek, aşağıdaki denedim: Send MMS

@Sam cevap olarak önerilen:

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.

Şimdi artık SecurityException hataları. Şimdi Android KitKat bir Nexus 5 üzerinde test ediyorum. Örnek kodu çalıştırdıktan sonra çağrısının bana 200 yanıt kodu veriyor

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

Ancak, MMS göndermeye çalıştım kişiyi kontrol ettim. Bir MMS aldı dediler.

CEVAP
14 ŞUBAT 2013, PERŞEMBE


Mobil veri kapalı olduğu için, yukarıda tarif aynı sorun (t-mobile USA üzerinde Galaxy Nexus vardı.

Jelly Bean. Ayarlar >Veri Kullanımını >mobil veri

Mobil veri MMS gönderme VEYA almadan ÖNCE açık olması gerektiğini unutmayın. Eğer mobil veri ile bir MMS kapalı alırsam, yeni bir ileti bildirimi alacağım ve bir indirme düğmesi ile bir mesaj alacaksınız. Ama eğer önce mobil veri var ise, gelen MMS Eki almış olacak. Eğer iletiyi aldıktan sonra açın.

Nedense ne zaman telefon sağlayıcısı sağlar için yeteneği göndermek ve almak MMS olmalısınız Mobil Veri etkin, hatta kullanıyorsanız, Wifi, Mobil Veri etkin edebilecektir alma ve gönderme MMS bile Wifi gösteren olarak internet üzerinde bir cihaz.

Eğer açık yaparsanız, mesaj Mobil Veri açma bile çok vakit ve cihazın yeniden başlatılmasını gerektirebilir gibi gerçek bir acı.

Bunu Paylaş:
  • Google+
  • E-Posta
Etiketler:

YORUMLAR

SPONSOR VİDEO

Rastgele Yazarlar

  • Amir Parmar

    Amir Parmar

    25 Kasım 2010
  • Droid Life

    Droid Life

    17 Kasım 2009
  • Leigh Momii

    Leigh Momii

    10 Mayıs 2006