আমি কীভাবে এসএমএস বার্তা প্রেরণ এবং গ্রহণ করতে পারি তা সন্ধান করেছি। এসএমএস বার্তা প্রেরণের জন্য আমাকে ক্লাসের পদ্ধতি sendTextMessage()
এবং sendMultipartTextMessage()
পদ্ধতিগুলি কল করতে হয়েছিল SmsManager
। এসএমএস বার্তা পেতে, আমাকে AndroidMainfest.xml
ফাইলে একটি রিসিভার নিবন্ধন করতে হয়েছিল register তারপরে আমাকে এর 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...
}
}
Andro আইডি
<?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>
এমএমএসআরসিভার ক্লাসে, onReceive()
পদ্ধতিটি কেবলমাত্র ফোন নম্বরটি ধরতে সক্ষম হয় যে বার্তাটি পাঠানো হয়েছিল। আপনি কীভাবে কোনও এমএমএস থেকে অন্যান্য গুরুত্বপূর্ণ জিনিসগুলি মিডিয়া সংযুক্তি (চিত্র / অডিও / ভিডিও), বা এমএমএসের পাঠ্যের মতো ফাইল পাথ ধরেন?
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.Inttent) ব্যবহার করে অতিরিক্ত মানগুলি বের করা যেতে পারে। যদি এই উদ্দেশ্যটি প্রক্রিয়াকরণের সময় কোনও ব্রডকাস্টারসিভার কোনও ত্রুটির মুখোমুখি হয় তবে ফলাফলের কোডটি যথাযথভাবে সেট করা উচিত।
@SdkConstant(SdkConstantType.BROADCAST_INTENT_ACTION) public static final String DATA_SMS_RECEIVED_ACTION = "android.intent.action.DATA_SMS_RECEIVED";
ব্রডকাস্ট অ্যাকশন: ডিভাইসটির মাধ্যমে একটি নতুন ডাব্লুএপি পুশ বার্তা পেয়েছে। অভিপ্রায়টির অতিরিক্ত অতিরিক্ত মান থাকবে:
transactionId (Integer)
- ডাব্লুএপি লেনদেনের আইডি
pduType (Integer)
- ওয়াপ পিডিইউ টাইপ `
header (byte[])
- বার্তা শিরোনাম
data (byte[])
- বার্তাটির ডেটা পেলোড
contentTypeParameters (HashMap<String,String>)
- সামগ্রীর ধরণের সাথে যুক্ত কোনও প্যারামিটার (ডাব্লুএসপি কনটেন্ট-টাইপ শিরোনাম থেকে ডিকোড করা)যদি এই উদ্দেশ্যটি প্রক্রিয়াকরণের সময় কোনও ব্রডকাস্টার্সিভার কোনও ত্রুটির মুখোমুখি হয় তবে ফলাফলের কোডটি যথাযথভাবে সেট করা উচিত। কন্টেন্ট টাইপপ্যারামিটারের অতিরিক্ত মান হ'ল তাদের নামের দ্বারা চিহ্নিত কন্টেন্ট প্যারামিটারের মানচিত্র। যদি কোনও অ-স্বাক্ষরিত সুপরিচিত পরামিতিগুলির মুখোমুখি হয় তবে মানচিত্রের কীটি 'আনইসাইনড / 0 এক্স ...' হবে, যেখানে '...' হ'ল আনসাইন করা প্যারামিটারের হেক্স মান। যদি কোনও প্যারামিটারের ন-মান থাকে তবে মানচিত্রে মানটি শূন্য হবে।
@SdkConstant(SdkConstantType.BROADCAST_INTENT_ACTION) public static final String WAP_PUSH_RECEIVED_ACTION = "android.provider.Telephony.WAP_PUSH_RECEIVED";
আপডেট # 2
আমি কীভাবে অতিরিক্ত কোনও পাস PendingIntent
করতে হয় তা সন্ধান করেছি BroadcastReceiver
:
একটি অ্যান্ড্রয়েড পেন্ডিংআইসেন্ট এক্সট্রা, ব্রডকাস্টআরসিভার দ্বারা প্রাপ্ত নয়
যাইহোক, অতিরিক্ত প্রেরণ পরার SendBroadcastReceiver না 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()
APNHelper
final Cursor apnCursor = this.context.getContentResolver().query(Uri.withAppendedPath(Carriers.CONTENT_URI, "current"), null, null, null, null);
স্পষ্টতই আপনি Android 4.2 এপিএন পড়তে পারবেন না
অপারেশন সম্পাদনের জন্য মোবাইল ডেটা ব্যবহার করে (এমএমএস প্রেরণের মতো) এবং ডিভাইসে উপস্থিত ডিফল্ট এপিএন সেটিংস জানেন না এমন সমস্ত অ্যাপ্লিকেশনগুলির বিকল্প কী?
আপডেট # 4
এমএমএস প্রেরণ করা হচ্ছে
আমি এই উদাহরণটি অনুসরণ করার চেষ্টা করেছি: এমএমএস প্রেরণ করুন
যেমন @ সাম তার উত্তরে পরামর্শ দিয়েছে:
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.
সুতরাং এখন আমি আর সুরক্ষার ধারণার ত্রুটিগুলি পাই না। আমি এখন অ্যান্ড্রয়েড কিটক্যাট নেক্সাস 5 এ পরীক্ষা করছি। নমুনা কোড চালানোর পরে এটি আমাকে কল করার পরে একটি 200 প্রতিক্রিয়া কোড দেয়
MMResponse mmResponse = sender.send(out, isProxySet, MMSProxy, MMSPort);
তবে আমি যার সাথে এমএমএস প্রেরণের চেষ্টা করেছি তার সাথে আমি চেক করেছিলাম। এবং তারা বলেছিল যে তারা কখনও এমএমএস পায় না।