آموزش دریافت خودکار sms در اندروید ، تا به حال در اپلیکیشن های مختلفی شاهد زمانی بودید که باید در اپ ثبت نام کنید و این عمل ثبت نام قطعا با روشی از احراز هویت همراه ست.
در ادامه یکی از محبوب ترین روش ها که کار را برای کاربر بسیار راحت میکند را با هم مرور میکنیم.
برای دریافت سور کد هم میتوانید به کانال تلگرام ما مراجعه فرمایید
آموزش دریافت خودکار sms در اندروید ، این روش ممکن است ارسال ایمیل , ارسال sms و یا تماس با شما باشد که در اکثر مواقع یک کد برای شما ارسال میشود
که باید آنرا به اپ بدهید تا بتواند هویت شما را تایید کند.
ارسال کد به شماره موبایل راحت ترین و بی دردسر ترین روش احراز هویت است
که البته میتوان این روش را بسیار ساده تر برای کاربر ارائه داد
بدین صورت که دیگر نیاز نباشد پس از دریافت پیام به صندوق دریافتی پیام های خود رفته و کد را کپی کرده و به اپ بدهد
بلکه خود اپ پس از دریافت پیام , ارسال کننده پیام را چک کند و درصورت مطابقت , متن پیام را بردارد و وارد کند
در این روش کاربر عملا لازم نیست کاری بجز وارد کردن شماره موبایل درست را انجام دهد.
اما این روش مستلزم دسترسی اپلیکیشن به پیام ها یا sms های کاربر است که در نسخه های پیشین اندروید ۶ این مجوز ها تنها در manifest قرار میگرفت
اما در نسخه های بعدی اندروید ۶ این مجوز ها به صورت runtime از کاربر گرفته میشود چون جزو dangerous permission هستند.
در ادامه ما سورس کد ارسال یک پیام فیک و دریافت متن پیام به صورت خودکار توسط اپ را آموزش خواهیم داد.
ابتدا یک پروژه ساده ایجاد کنید.
ما در این پروژه نیاز به هیچگونه UI نداریم چون تنها هدف خواندن خودکار متن پیام دریافتی است.
ما نیز تنها یک TextView در فایل xml خود قرار دادیم
<?xml version="1.0" encoding="utf-8"?> <android.support.constraint.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:app="http://schemas.android.com/apk/res-auto" xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" android:layout_height="match_parent" tools:context="com.tejariapp.messagereceive.MainActivity"> <TextView android:id="@+id/code" android:layout_width="wrap_content" android:layout_height="wrap_content" android:fontFamily="@font/monaco" android:text="Code" android:textColor="?attr/colorAccent" android:textSize="30sp" app:layout_constraintBottom_toBottomOf="parent" app:layout_constraintLeft_toLeftOf="parent" app:layout_constraintRight_toRightOf="parent" app:layout_constraintTop_toTopOf="parent" /> </android.support.constraint.ConstraintLayout>
در این پروژه ما تنها سه بخش داریم
اینترفیس را به صورت زیر با عنوان Sms Listener ایجادمیکنیم
package com.tejariapp.messagereceive; /** * * Created by MDN on 09/12/2017. * */ public interface SmsListener { void onMessageReceived(String messageText); }
package com.tejariapp.messagereceive; import android.content.BroadcastReceiver; import android.content.Context; import android.content.Intent; import android.os.Bundle; import android.telephony.SmsMessage; /** * Created by Marjan on 09/12/2017. * Own WebSite is Tejariapp.com */ public class SmsReceiver extends BroadcastReceiver { private static SmsListener mListener; @Override public void onReceive(Context context, Intent intent) { Bundle data = intent.getExtras(); Object[] pdus = (Object[]) data.get("pdus"); for(int i=0;i<pdus.length;i++){ SmsMessage smsMessage = SmsMessage.createFromPdu((byte[]) pdus[i]); String sender = smsMessage.getDisplayOriginatingAddress(); //You must check here if the sender is // your provider and not another one with same text. String messageBody = smsMessage.getMessageBody(); //Pass on the text to our listener. mListener.onMessageReceived(messageBody); } } public static void bindListener(SmsListener listener) { mListener = listener; } }
که یک پروتکل برای انتقال پیام های SMS در مخابرات است و ما آرایه ای از این پیام ها را دریافت می کنیم
که به وسیله سیستم به گیرنده ما ارسال می شود.
حال با استفاده از متد createFromPdu() یک شی SmsMessage ایجاد میکنیم
تا بتوانیم از طریق این شی به ارسال کننده و متن پیام درسترسی پیدا کنیم.
همانطور که در کامنت هم گفته شده پس از دریافت ارسال کننده پیام با استفاده از متد
smsMessage.getDisplayOriginatingAddress()
میتوان آن را با ارسال کننده مدنظر خودمان مقایسه کرد و درصورتی که مطابقت داشت مقدار پیام را با اینترفیس به اکتیویتی ارسال کرد .
اما در این پروژه ما محدودیتی برای پیام ها درنظر نگرفته ایم و هرپیامی که دریافت شود متن آنرا به اکتیویتی
با استفاده از متد onMessageReceive(messageBody) ارسال خواهیم کرد.
<receiver android:name="com.tejariapp.messagereceive.SmsReceiver"> <intent-filter> <action android:name="android.provider.Telephony.SMS_RECEIVED"/> </intent-filter> </receiver>
<uses-permission android:name="android.permission.SEND_SMS"/> <uses-permission android:name="android.permission.READ_SMS"/> <uses-permission android:name="android.permission.RECEIVE_SMS" />
حال تنها کافی است پیام را در اکتیویتی اصلی دریافت کنیم و نمایش دهیم
و البته مجوز runtime هم برای دریافت و ارسال sms ایجاد کرده ایم
package com.tejariapp.messagereceive; import android.Manifest; import android.content.pm.PackageManager; import android.support.v4.app.ActivityCompat; import android.support.v4.content.ContextCompat; import android.support.v7.app.AppCompatActivity; import android.os.Bundle; import android.telephony.SmsManager; import android.util.Log; import android.widget.TextView; import java.util.Random; public class MainActivity extends AppCompatActivity { private static final int PERMISSION_REQUEST_CODE = 1; TextView mCodeView; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); mCodeView=findViewById(R.id.code); SmsReceiver.bindListener(new SmsListener() { @Override public void onMessageReceived(String messageText) { Log.e("Text",messageText); mCodeView.setText(messageText); } }); requestPermission(); sendFakeSms(); } //send fake sms to emulator private void sendFakeSms(){ Random rand = new Random(); int n = rand.nextInt(50) + 1; SmsManager sms= SmsManager.getDefault(); sms.sendTextMessage("5554",null, String.valueOf(n),null,null); Log.e("MESSAGE BODY",String.valueOf(n)); } //runtime permission private void requestPermission(){ ActivityCompat.requestPermissions(MainActivity.this,new String[]{ Manifest.permission.SEND_SMS},PERMISSION_REQUEST_CODE); } private boolean checkPermission(){ int result = ContextCompat.checkSelfPermission(MainActivity.this, Manifest.permission.ACCESS_FINE_LOCATION); if (result == PackageManager.PERMISSION_GRANTED){ return true; } else { return false; } } }
حال میتوان برنامه را روی شبیه ساز جرا کرد و خوا هیم دید هنگام اجرا یک sms که حاوی یک عدد تصادفی است به شبیه ساز ارسال
و همچنین مقدار در textView نیز قرار میگیرد.
1 Comment
سلام
خط ۶۲ به جای :
Manifest.permission.ACCESS_FINE_LOCATION
باید می نوشتین:
Manifest.permission.SEND_SMS
ممنون از آموزش عالی و کاملتون.