SMS mesajlarını nasıl gönderip alacağımı buldum. SMS mesajları göndermek için sınıfın sendTextMessage()
ve sendMultipartTextMessage()
yöntemlerini aramam gerekiyordu SmsManager
. SMS mesajları almak için AndroidMainfest.xml
dosyaya bir alıcı kaydetmem gerekiyordu . Sonra. onReceive()
Yöntemini geçersiz kılmam gerekti BroadcastReceiver
. 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, benzer şekilde MMS mesajları gönderip alabileceğinizi merak ediyordum. Biraz araştırma yaptıktan sonra, bloglarda verilen birçok örnek basitçeIntent
yerel Mesajlaşma uygulamasına geçer. Başvurumdan çıkmadan bir MMS göndermeye çalışıyorum. MMS gönderip almanın standart bir yolu yok gibi görünüyor. Bunu çalıştıran oldu mu?
Ayrıca, SMS / MMS ContentProvider'ın resmi Android SDK'nın bir parçası olmadığının farkındayım, ancak birinin bunu uygulayabileceğini düşünüyordum. Herhangi bir yardım çok takdir edilmektedir.
Güncelleme
MMS mesajlarını almak BroadcastReceiver
için AndroidManifest.xml
dosyaya bir ekledim
<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ında, onReceive()
yöntem yalnızca mesajın gönderildiği phoneNumber öğesini alabilir. Bir MMS'den medya ekine giden dosya yolu (resim / ses / video) veya MMS'deki metin gibi diğer önemli şeyleri nasıl alırsınız?
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.Telefon Dokümantasyonuna göre :
Yayın Eylemi: Cihaz tarafından yeni bir metin tabanlı SMS mesajı alındı. Amaç, aşağıdaki ekstra değerlere sahip olacaktır:
pdus
- BirObject[]
ofbyte[]
mesajı oluşturan PDU'lan içeren s.Ekstra değerler kullanılarak elde edilebilir
getMessagesFromIntent(android.content.Intent)
Eğer bir BroadcastReceiver bu amacı işlerken bir hatayla karşılaşırsa, sonuç kodunu uygun şekilde ayarlaması gerekir.@SdkConstant(SdkConstantType.BROADCAST_INTENT_ACTION) public static final String SMS_RECEIVED_ACTION = "android.provider.Telephony.SMS_RECEIVED";
Yayın Eylemi: Cihaz tarafından yeni bir veri tabanlı SMS mesajı alındı. Amaç, aşağıdaki ekstra değerlere sahip olacaktır:
pdus
- BirObject[]
ofbyte[]
mesajı oluşturan PDU'lan içeren s.Ekstra değerler getMessagesFromIntent (android.content.Intent) kullanılarak ayıklanabilir. Bir BroadcastReceiver bu amacı işlerken bir hatayla karşılaşırsa, sonuç kodunu uygun şekilde ayarlaması gerekir.
@SdkConstant(SdkConstantType.BROADCAST_INTENT_ACTION) public static final String DATA_SMS_RECEIVED_ACTION = "android.intent.action.DATA_SMS_RECEIVED";
Yayın Eylemi: Cihaz yeni bir WAP PUSH mesajı aldı. Amaç, aşağıdaki ekstra değerlere sahip olacaktır:
transactionId (Integer)
- WAP işlem kimliği
pduType (Integer)
- WAP PDU türü`
header (byte[])
- Mesajın başlığı
data (byte[])
- Mesajın veri yükü
contentTypeParameters (HashMap<String,String>)
- İçerik türüyle ilişkili tüm parametreler (kodu WSP İçerik Türü başlığından çözülür)Bir BroadcastReceiver bu amacı işlerken bir hatayla karşılaşırsa, sonuç kodunu uygun şekilde ayarlaması gerekir. ContentTypeParameters ekstra değeri, adlarıyla anahtarlanan içerik parametrelerinin haritasıdır. Atanmamış herhangi bir iyi bilinen parametrelerle karşılaşılırsa, haritanın anahtarı 'atanmamış / 0x ...' olacaktır, burada '...' atanmamış parametrenin onaltılık değeridir. Bir parametrenin Değeri Yok ise, haritadaki değer boş olacaktır.
@SdkConstant(SdkConstantType.BROADCAST_INTENT_ACTION) public static final String WAP_PUSH_RECEIVED_ACTION = "android.provider.Telephony.WAP_PUSH_RECEIVED";
2 numaralı güncelleme
Ben de ekstra geçmesine nasıl anladım var PendingIntent
bir tarafından alınacak BroadcastReceiver
:
Android PendingIntent ekstralar, BroadcastReceiver tarafından alınmayan
Ancak, fazlalıklar SMSReceiver'a değil SendBroadcastReceiver'a aktarılır . Ekstra SMSReceiver'a nasıl aktarabilirim ?
3 numaralı güncelleme
MMS alma
Bu nedenle, daha fazla araştırma yaptıktan sonra, a ContentObserver
. Bu şekilde, content://mms-sms/conversations
İçerik Sağlayıcıda herhangi bir değişiklik olup olmadığını tespit edebilir ve sonuç olarak gelen MMS'leri tespit etmenize olanak sağlar. İşte bulduğum işe yaraması için en yakın örnek: MMS alma
Ancak, değişken vardır mainActivity
Çeşidi ServiceController
. ServiceController
Sınıf nerede uygulanır? Kayıtlı birinin başka uygulamaları var ContentObserver
mı?
MMS gönderme
MMS göndermeye gelince, şu örnekle karşılaştım: MMS Gönder
Sorun şu ki, Android v4.2.2'de bulunan Nexus 4 cihazımda bu kodu çalıştırmayı denedim ve şu 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 , sınıfın yönteminde Carriers
ContentProvider'ı sorguladıktan sonra atılır .getMMSApns()
APNHelper
final Cursor apnCursor = this.context.getContentResolver().query(Uri.withAppendedPath(Carriers.CONTENT_URI, "current"), null, null, null, null);
Görünüşe göre Android 4.2'de APN'leri okuyamıyorsunuz
İşlemleri gerçekleştirmek için (MMS göndermek gibi) mobil veri kullanan ve cihazda bulunan varsayılan APN ayarını bilmeyen tüm bu uygulamalar için alternatif nedir?
4 numaralı güncelleme
MMS gönderme
Bu örneği izlemeyi denedim: MMS gönder
@ Sam'in cevabında önerdiği gibi:
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.
Bu yüzden artık SecurityException hatalarını almıyorum. Şimdi Android KitKat üzerinde bir Nexus 5 üzerinde test yapıyorum. Örnek kodu çalıştırdıktan sonra, çağrıdan sonra bana bir 200 yanıt kodu veriyor
MMResponse mmResponse = sender.send(out, isProxySet, MMSProxy, MMSPort);
Ancak, MMS göndermeye çalıştığım kişiyi kontrol ettim. Ve MMS'i asla almadıklarını söylediler.