मुझे पता चला है कि एसएमएस संदेश कैसे भेजें और प्राप्त करें। एसएमएस संदेश भेजने के लिए मुझे कक्षा के तरीकों sendTextMessage()
और sendMultipartTextMessage()
तरीकों को कॉल करना पड़ा SmsManager
। एसएमएस संदेश प्राप्त करने के लिए, मुझे 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>
हालांकि, मैं सोच रहा था कि क्या आप इसी तरह से एमएमएस संदेश भेज और प्राप्त कर सकते हैं। कुछ शोध करने के बाद, ब्लॉग पर उपलब्ध कराए गए कई उदाहरण केवल Intent
मूल मैसेजिंग एप्लिकेशन को पास करते हैं। मैं अपने आवेदन को छोड़े बिना एक एमएमएस भेजने की कोशिश कर रहा हूं। एमएमएस भेजने और प्राप्त करने का एक मानक तरीका प्रतीत नहीं होता है। किसी को भी काम करने के लिए यह मिल गया है?
इसके अलावा, मुझे पता है कि एसएमएस / एमएमएस कन्टैंटप्रॉइडर आधिकारिक एंड्रॉइड एसडीके का हिस्सा नहीं है, लेकिन मैं सोच रहा था कि कोई व्यक्ति इसे लागू करने में सक्षम हो सकता है। कोई भी मदद बहुत ही सराहनीय होगी।
अपडेट करें
मैंने एमएमएस संदेश प्राप्त BroadcastReceiver
करने के लिए AndroidManifest.xml
फ़ाइल में एक जोड़ा है
<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 को हथियाने में सक्षम है जो संदेश से भेजा गया था। आप एमएमएस से अन्य महत्वपूर्ण चीजों को कैसे पकड़ते हैं जैसे कि मीडिया अटैचमेंट (छवि / ऑडियो / वीडियो), या एमएमएस में पाठ का रास्ता?
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 के प्रलेखन के अनुसार :
ब्रॉडकास्ट एक्शन: डिवाइस द्वारा एक नया टेक्स्ट आधारित एसएमएस संदेश प्राप्त हुआ है। आशय में निम्नलिखित अतिरिक्त मूल्य होंगे:
pdus
- एकObject[]
कीbyte[]
PDUs कि संदेश श्रृंगार युक्त रों।अतिरिक्त मान का उपयोग करके निकाला जा सकता है
getMessagesFromIntent(android.content.Intent)
यदि इस आशय को संसाधित करते समय कोई ब्रॉडकास्टसीवर एक त्रुटि का सामना करता है तो उसे परिणाम कोड को उचित रूप से सेट करना चाहिए।@SdkConstant(SdkConstantType.BROADCAST_INTENT_ACTION) public static final String SMS_RECEIVED_ACTION = "android.provider.Telephony.SMS_RECEIVED";
ब्रॉडकास्ट एक्शन: डिवाइस द्वारा एक नया डेटा आधारित एसएमएस संदेश प्राप्त हुआ है। आशय में निम्नलिखित अतिरिक्त मूल्य होंगे:
pdus
- एकObject[]
कीbyte[]
PDUs कि संदेश श्रृंगार युक्त रों।अतिरिक्त मान getMessagesFromIntent (android.content.Intent) का उपयोग करके निकाले जा सकते हैं। यदि कोई ब्रॉडकास्टसीवर इस आशय को संसाधित करते समय एक त्रुटि का सामना करता है तो उसे परिणाम कोड को उचित रूप से सेट करना चाहिए।
@SdkConstant(SdkConstantType.BROADCAST_INTENT_ACTION) public static final String DATA_SMS_RECEIVED_ACTION = "android.intent.action.DATA_SMS_RECEIVED";
ब्रॉडकास्ट एक्शन: डिवाइस द्वारा एक नया WAP PUSH संदेश प्राप्त हुआ है। आशय में निम्नलिखित अतिरिक्त मूल्य होंगे:
transactionId (Integer)
- वैप लेनदेन आईडी
pduType (Integer)
- WAP PDU प्रकार `
header (byte[])
- संदेश का हेडर
data (byte[])
- मैसेज का डेटा पेलोड
contentTypeParameters (HashMap<String,String>)
- सामग्री प्रकार से जुड़ा कोई भी पैरामीटर (WSP सामग्री-प्रकार हेडर से डीकोड किया गया)यदि कोई ब्रॉडकास्टसीवर इस आशय को संसाधित करते समय एक त्रुटि का सामना करता है तो उसे परिणाम कोड को उचित रूप से सेट करना चाहिए। ContentTypeParameters अतिरिक्त मान उनके नाम के द्वारा सूचीबद्ध सामग्री मापदंडों का मानचित्र है। यदि कोई भी अन-असाइन किए गए प्रसिद्ध पैरामीटर का सामना किया जाता है, तो मानचित्र की कुंजी 'अनसाइनड / 0x ...' होगी, जहां '...' अनसाइनड पैरामीटर का हेक्स मान है। यदि किसी पैरामीटर में नो-वैल्यू है, तो मैप में मूल्य शून्य होगा।
@SdkConstant(SdkConstantType.BROADCAST_INTENT_ACTION) public static final String WAP_PUSH_RECEIVED_ACTION = "android.provider.Telephony.WAP_PUSH_RECEIVED";
अद्यतन # 2
मुझे पता चला है कि एक्स्ट्रा पास कैसे PendingIntent
प्राप्त किया जा सकता है BroadcastReceiver
:
a Android PendingIntent एक्स्ट्रा कलाकार, ब्रॉडकास्टर द्वारा प्राप्त नहीं
हालांकि, अतिरिक्त के लिए पारित हो जाता है SendBroadcastReceiver नहीं SMSReceiver । मैं SMSReceiver के लिए एक अतिरिक्त कैसे पास कर सकता हूं ?
अद्यतन # 3
एमएमएस प्राप्त करना
इसलिए अधिक शोध करने के बाद मैंने पंजीकरण करने के कुछ सुझाव देखे ContentObserver
। इस तरह से आप पता लगा सकते हैं कि content://mms-sms/conversations
कंटेंट प्रोवाइडर में कोई बदलाव है या नहीं , फलस्वरूप आपको आने वाले एमएमएस का पता लगाने की अनुमति मिलती है। यहां यह काम करने के लिए निकटतम उदाहरण है जो मुझे मिला है: एमएमएस प्राप्त करना
हालांकि, वहाँ mainActivity
प्रकार का एक चर है ServiceController
। ServiceController
कक्षा कहाँ से लागू की गई है? क्या किसी पंजीकृत के अन्य कार्यान्वयन हैं ContentObserver
?
एमएमएस भेजना
एमएमएस भेजने के लिए, मैं इस उदाहरण पर आया हूं: एमएमएस भेजें
समस्या यह है कि मैंने अपने नेक्सस 4 पर इस कोड को चलाने की कोशिश की, जो एंड्रॉइड v4.2.2 पर है, और मुझे यह त्रुटि प्राप्त हो रही है:
java.lang.SecurityException: No permission to write APN settings: Neither user 10099 nor current process has android.permission.WRITE_APN_SETTINGS.
कक्षा Carriers
की getMMSApns()
विधि में ContentProvider को क्वेरी करने के बाद त्रुटि हो जाती है APNHelper
।
final Cursor apnCursor = this.context.getContentResolver().query(Uri.withAppendedPath(Carriers.CONTENT_URI, "current"), null, null, null, null);
जाहिरा तौर पर आप Android 4.2 में APNs नहीं पढ़ सकते हैं
उन सभी अनुप्रयोगों के लिए विकल्प क्या है जो ऑपरेशन करने के लिए मोबाइल डेटा का उपयोग करते हैं (जैसे एमएमएस भेजना) और डिवाइस में मौजूद डिफ़ॉल्ट एपीएन सेटिंग को नहीं जानते हैं?
अद्यतन # 4
एमएमएस भेजना
मैंने इस उदाहरण का अनुसरण करने की कोशिश की है: एमएमएस भेजें
जैसा @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 पर परीक्षण कर रहा हूं। सैंपल कोड चलाने के बाद कॉल करने के बाद यह मुझे 200 रिस्पॉन्स कोड देता है
MMResponse mmResponse = sender.send(out, isProxySet, MMSProxy, MMSPort);
हालांकि, मैंने उस व्यक्ति के साथ जांच की जिसे मैंने एमएमएस भेजने की कोशिश की थी। और उन्होंने कहा कि उन्हें कभी एमएमएस प्राप्त नहीं हुआ।