telegrambotlogo
سورس کد ربات تلگرام با سی شارپ
آبان ۲۷, ۱۳۹۶
پروژه اتصال به برد arduino با استفاده از پورت سریال با سی شارپ
پروژه اتصال به برد arduino با استفاده از پورت سریال در سی شارپ
بهمن ۷, ۱۳۹۶

سورس کد دریافت پیام تاییدیه به صورت خودکار در اندروید

آموزش دریافت خودکار sms در اندروید

آموزش دریافت خودکار sms در اندروید

آموزش دریافت خودکار 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>

در این پروژه ما تنها سه بخش داریم
  • کلاسی که درقالب broadcast receiver زمانی که smsی دریافت شد اجرا میشود
  • اینترفیسی که رابطی بین broadcast receiver و اکتیویتی اصلی ماست و پیغام را از برودکست به اکتیویتی منتقل میکند.
  • و یک اکتیویتی اصلی که تمامی رخداد ها ازسمت برودکست را به ما نمایش دهد.

اینترفیس را به صورت زیر با عنوان Sms Listener  ایجادمیکنیم

package com.tejariapp.messagereceive;

/**
 *
 * Created by MDN on 09/12/2017.
 *
 */

public interface SmsListener {
    void onMessageReceived(String messageText);
}

سپس کلاس SmsReceiver را به صورت زیر ایجاد میکنیم

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;
}
}

پارامتر intent دریافتی در واقع شامل شی PDU یا  (Protocol Data Unit)

که یک پروتکل برای انتقال پیام های SMS در مخابرات است و  ما آرایه ای از این پیام ها را دریافت می کنیم

که به وسیله سیستم به گیرنده ما ارسال می شود.

حال با استفاده از متد createFromPdu() یک شی SmsMessage ایجاد میکنیم

تا بتوانیم از طریق این شی به ارسال کننده و متن پیام درسترسی پیدا کنیم.

همانطور که در  کامنت هم گفته شده پس از دریافت ارسال کننده پیام با استفاده از متد

smsMessage.getDisplayOriginatingAddress() 

میتوان آن را با ارسال کننده مدنظر خودمان مقایسه کرد و درصورتی که مطابقت داشت مقدار پیام را با اینترفیس به اکتیویتی ارسال کرد .

اما در این پروژه ما محدودیتی برای پیام ها درنظر نگرفته ایم و هرپیامی که دریافت شود متن آنرا به اکتیویتی

با استفاده از متد onMessageReceive(messageBody) ارسال خواهیم کرد.

 

**اما نکته مهم این است که این کلاس را به عنوان service به manifest اضافه کنیم

 

 <receiver android:name="com.tejariapp.messagereceive.SmsReceiver">
 <intent-filter>
 <action android:name="android.provider.Telephony.SMS_RECEIVED"/>
 </intent-filter>
 </receiver>

**همچنین مجوز های دسترسی به sms هارا نیز در manifest قرار میدهیم

<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 دیدگاه

  1. Farhad گفت:

    سلام
    خط ۶۲ به جای :
    Manifest.permission.ACCESS_FINE_LOCATION
    باید می نوشتین:
    Manifest.permission.SEND_SMS
    ممنون از آموزش عالی و کاملتون.

پاسخ دهید

نشانی ایمیل شما منتشر نخواهد شد. بخش‌های موردنیاز علامت‌گذاری شده‌اند *