android - অ্যান্ড্রয়েড-ইনকামিং এসএমএস বার্তা জন্য শুনুন
sms android-service (4)
আমি ইনকামিং এসএমএস বার্তাগুলির নজরদারি করার জন্য একটি অ্যাপ্লিকেশন তৈরি করার চেষ্টা করছি এবং ইনকামিং এসএমএসের মাধ্যমে একটি প্রোগ্রাম চালু করি, এটি এসএমএস থেকে সামগ্রীটি পড়তে হবে।
কর্মপ্রবাহ:
- এসএমএস অ্যান্ড্রয়েড ডিভাইসে পাঠানো হয়েছে
- স্ব এক্সিকিউটেবল অ্যাপ্লিকেশন
- এসএমএস তথ্য পড়ুন
@ মাইক এম। এবং আমি গৃহীত উত্তর (আমাদের মন্তব্য দেখুন) সঙ্গে একটি সমস্যা খুঁজে পাওয়া যায় নি:
মূলত, আমরা প্রতিটি সময় মাল্টিপার্ট বার্তা সংহত না করা হলে লুপের মাধ্যমে যেতে কোনও পয়েন্ট নেই:
for (int i = 0; i < msgs.length; i++) {
msgs[i] = SmsMessage.createFromPdu((byte[])pdus[i]);
msg_from = msgs[i].getOriginatingAddress();
String msgBody = msgs[i].getMessageBody();
}
লক্ষ্য করুন যে আমরা msgBody
বার্তাটির সংশ্লিষ্ট অংশের স্ট্রিং msgBody
সেট msgBody
, কোনও সূচী আমরা যাই হোক না কেন, যা এসএমএস বার্তাগুলির বিভিন্ন অংশগুলির মাধ্যমে লুপিংয়ের সম্পূর্ণ বিন্দুকে নিরর্থক করে তোলে, কারণ এটি কেবল সেট করা যাবে খুব শেষ সূচক মান। পরিবর্তে আমরা +=
ব্যবহার করা উচিত, অথবা মাইক হিসাবে উল্লেখ করা হয়েছে, StringBuilder
:
সর্বোপরি, আমার এসএমএস প্রাপ্তির কোডটি এই রকম দেখাচ্ছে:
if (myBundle != null) {
Object[] pdus = (Object[]) myBundle.get("pdus"); // pdus is key for SMS in bundle
//Object [] pdus now contains array of bytes
messages = new SmsMessage[pdus.length];
for (int i = 0; i < messages.length; i++) {
messages[i] = SmsMessage.createFromPdu((byte[]) pdus[i]); //Returns one message, in array because multipart message due to sms max char
Message += messages[i].getMessageBody(); // Using +=, because need to add multipart from before also
}
contactNumber = messages[0].getOriginatingAddress(); //This could also be inside the loop, but there is no need
}
শুধু অন্য কেউ একই বিভ্রান্তির আছে যদি এই উত্তর নির্বাণ আউট।
এই আমি ব্যবহার কি!
public class SMSListener extends BroadcastReceiver {
// Get the object of SmsManager
final SmsManager sms = SmsManager.getDefault();
String mobile,body;
public void onReceive(Context context, Intent intent) {
// Retrieves a map of extended data from the intent.
final Bundle bundle = intent.getExtras();
try {
if (bundle != null) {
final Object[] pdusObj = (Object[]) bundle.get("pdus");
for (int i = 0; i < pdusObj.length; i++) {
SmsMessage currentMessage = SmsMessage.createFromPdu((byte[]) pdusObj[i]);
String phoneNumber = currentMessage.getDisplayOriginatingAddress();
String senderNum = phoneNumber;
String message = currentMessage.getDisplayMessageBody();
mobile=senderNum.replaceAll("\\s","");
body=message.replaceAll("\\s","+");
Log.i("SmsReceiver", "senderNum: "+ senderNum + "; message: " + body);
// Show Alert
int duration = Toast.LENGTH_LONG;
Toast toast = Toast.makeText(context,
"senderNum: "+ mobile+ ", message: " + message, duration);
toast.show();
} // end for loop
} // bundle is null
} catch (Exception e) {
Log.e("SmsReceiver", "Exception smsReceiver" +e);
}
}
}
যদি আপনি খোলা ক্রিয়াকলাপে অভিপ্রায় পরিচালনা করতে চান তবে আপনি PendintIntent (নীচের সম্পূর্ণ পদক্ষেপগুলি) ব্যবহার করতে পারেন:
public class SMSReciver extends BroadcastReceiver {
@Override
public void onReceive(Context context, Intent intent) {
final Bundle bundle = intent.getExtras();
try {
if (bundle != null) {
final Object[] pdusObj = (Object[]) bundle.get("pdus");
for (int i = 0; i < pdusObj.length; i++) {
SmsMessage currentMessage = SmsMessage.createFromPdu((byte[]) pdusObj[i]);
String phoneNumber = currentMessage.getDisplayOriginatingAddress();
String senderNum = phoneNumber;
String message = currentMessage.getDisplayMessageBody();
try {
if (senderNum.contains("MOB_NUMBER")) {
Toast.makeText(context,"",Toast.LENGTH_SHORT).show();
Intent intentCall = new Intent(context, MainActivity.class);
intentCall.putExtra("message", currentMessage.getMessageBody());
PendingIntent pendingIntent= PendingIntent.getActivity(context, 0, intentCall, PendingIntent.FLAG_UPDATE_CURRENT);
pendingIntent.send();
}
} catch (Exception e) {
}
}
}
} catch (Exception e) {
}
}
}
সুস্পষ্ট:
<activity android:name=".MainActivity"
android:launchMode="singleTask"/>
<receiver android:name=".SMSReciver">
<intent-filter android:priority="1000">
<action android:name="android.provider.Telephony.SMS_RECEIVED"/>
</intent-filter>
</receiver>
onNewIntent:
@Override
protected void onNewIntent(Intent intent) {
super.onNewIntent(intent);
Toast.makeText(this, "onNewIntent", Toast.LENGTH_SHORT).show();
onSMSReceived(intent.getStringExtra("message"));
}
অনুমতি:
<uses-permission android:name="android.permission.RECEIVE_SMS" />
<uses-permission android:name="android.permission.READ_SMS" />
<uses-permission android:name="android.permission.SEND_SMS" />
যদি কেউ আমার মত Xamarin অ্যান্ড্রয়েড এ একই বৈশিষ্ট্যটি (প্রাপ্ত SMS ব্যবহার করে OTP পড়ছে) কীভাবে উল্লেখ করে তা উল্লেখ করে:
এই কোডটি আপনার AndroidManifest.xml ফাইলে যুক্ত করুন:
<receiver android:name=".listener.BroadcastReveiverOTP"> <intent-filter> <action android:name="android.provider.Telephony.SMS_RECEIVED" /> </intent-filter> </receiver> <uses-permission android:name="android.permission.RECEIVE_SMS" /> <uses-permission android:name="android.permission.BROADCAST_SMS" /> <uses-permission android:name="android.permission.READ_SMS" />
তারপরে আপনার Android প্রকল্পে আপনার BroadcastReveiver ক্লাস তৈরি করুন।
[BroadcastReceiver(Enabled = true)] [IntentFilter(new[] { "android.provider.Telephony.SMS_RECEIVED" }, Priority = (int)IntentFilterPriority.HighPriority)] public class BroadcastReveiverOTP : BroadcastReceiver { public static readonly string INTENT_ACTION = "android.provider.Telephony.SMS_RECEIVED"; protected string message, address = string.Empty; public override void OnReceive(Context context, Intent intent) { if (intent.HasExtra("pdus")) { var smsArray = (Java.Lang.Object[])intent.Extras.Get("pdus"); foreach (var item in smsArray) { var sms = SmsMessage.CreateFromPdu((byte[])item); address = sms.OriginatingAddress; if (address.Equals("NotifyDEMO")) { message = sms.MessageBody; string[] pin = message.Split(' '); if (!string.IsNullOrWhiteSpace(pin[0])) { // NOTE : Here I'm passing received OTP to Portable Project using MessagingCenter. So I can display the OTP in the relevant entry field. MessagingCenter.Send<object, string>(this,MessengerKeys.OnBroadcastReceived, pin[0]); } } } } } }
অ্যান্ড্রয়েড প্রোজেক্টে আপনার মেইন অ্যাক্টিভিটি ক্লাসে এই ব্রডকাস্ট রিসিভার ক্লাসটি নিবন্ধন করুন:
public class MainActivity : global::Xamarin.Forms.Platform.Android.FormsAppCompatActivity { // Initialize your class private BroadcastReveiverOTP _receiver = new BroadcastReveiverOTP (); protected override void OnCreate(Bundle bundle) { base.OnCreate(bundle); global::Xamarin.Forms.Forms.Init(this, bundle); LoadApplication(new App()); // Register your receiver : RegisterReceiver(_receiver, new IntentFilter("android.provider.Telephony.SMS_RECEIVED")); } }