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 BroadcastReceiver
tarafı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
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ı.
Android e-Posta gönderme varsayılan/ku...
Alma Android API sürümü programlı...
Veri gönderme Android YAZI...
Veri gönderme android Ana Etkinlik içi...
uı için geri gönderme android asynctas...