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

احتمالاً تا به حال برنامه‌های زیادی را دیده‌اید که امکان برقراری اتصال تلفنی از برنامه را به کاربر می‌دهند یا پیامک ارسال می‌کنند. اگر می‌خواهید بدانید چطور از برنامه‌های اندروید با یک شماره خاص تماس بگیرید یا پیامک ارسال کنید، این مطلب را تا انتها بخوانید.

تماس گرفتن

برای تماس گرفتن با یک شماره از درون برنامه اندروید، دو راه وجود دارد:

۱- اجرای برنامه Dialer

۲- برقراری تماس مستقیم

برای شروع کار یک پروژه اندروید بسازید. در پروژه جدید، فایل چیدمان یا layout ساخته شده را باز کنید و آن را به شکل زیر ویرایش کنید:

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout
        xmlns:android="http://schemas.android.com/apk/res/android"
        xmlns:tools="http://schemas.android.com/tools"
        android:id="@+id/activity_main"
        android:orientation="vertical"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:paddingLeft="@dimen/activity_horizontal_margin"
        android:paddingRight="@dimen/activity_horizontal_margin"
        android:paddingTop="@dimen/activity_vertical_margin"
        android:paddingBottom="@dimen/activity_vertical_margin"
        android:gravity="center_horizontal|center_vertical"
        tools:context="com.chikeandroid.tutsplust_telephony.MainActivity">

    <EditText
            android:id="@+id/et_phone_no"
            android:hint="Enter Phone number"
            android:inputType="phone"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"/>
    
    <Button
            android:id="@+id/btn_dial"
            android:layout_gravity="center_horizontal"
            android:text="Dial"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"/>
</LinearLayout>

این صفحه بعد از اجرای برنامه شبیه تصویر زیر خواهد شد:

android-make-phone-call-and-send-sms-1در ادامه باید تغییراتی در MainActivity برنامه ایجاد کنیم:

import android.content.Intent;
import android.net.Uri;
import android.os.Bundle;
import android.support.v7.app.AppCompatActivity;
import android.text.TextUtils;
import android.view.View;
import android.widget.Button;
import android.widget.EditText;
import android.widget.Toast;

public class MainActivity extends AppCompatActivity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        // ۱
        Button mDialButton = (Button) findViewById(R.id.btn_dial);
        final EditText mPhoneNoEt = (EditText) findViewById(R.id.et_phone_no);

        mDialButton.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                // ۲
                String phoneNo = mPhoneNoEt.getText().toString();
                if(!TextUtils.isEmpty(phoneNo)) {
                    // ۳
                    String dial = "tel:" + phoneNo;

                    // ۴
                    Uri uri = Uri.parse(dial);                    

                    // ۵
                    Intent intent = new Intent(Intent.ACTION_DIAL, uri);

                    // ۶
                    startActivity(intent);
                }else {
                    Toast.makeText(MainActivity.this, "Enter a phone number", Toast.LENGTH_SHORT).show();
                }
            }
        });
    }
}

احتمالا با بیشتر قسمت‌های این کلاس آشنا هستید و تنها نکته مهم در تعریف متد onClick دکمه است.

توضیحات:

۱- دکمه‌ای را که در فایل layout تعریف کرده‌ایم را پیدا می‌کنیم و برای آن یک متد onClick تعریف می‌کنیم.

۲- در متد onClick دکمه، شماره‌ای که کاربر می‌خواهد با آن تماس بگیرد را از EditText می‌گیریم.

۳- یک رشته متنی تعریف می‌کنیم که با tel: شروع می‌شود و بعد از آن شماره تلفن مورد نظر قرار دارد. از این رشته برای ساخت یک Uri استفاده خواهیم کرد.

۴- با استفاده از رشته متنی فوق یک Uri می‌سازیم.

۵- همانطور که می‌دانید برای ارتباط بین اجزای یک برنامه و نیز ارتباط بین برنامه‌های مختلف از اینتنت (Intent) استفاده می‌شود. در فصل‌های ۲۰ و ۲۱ درباره اینتنت‌ها گفتیم. بد نیست برای یادآوری دوباره یک نگاهی به آن‌ها بیاندازید. در اینجا هم برای اجرای برنامه Dialer باید یک Intent بسازیم و آن را start کنیم. نکته مهم در اینجا عملیات یا Action است که به اینتنت می‌دهیم: ACTION_DIAL. همانطور که از اسم این عملیات برمی‌آید این Intent با هدف گرفتن یک شماره تلفن ساخته شده است.

۶- حالا وقت آن رسیده است که این Intent را آغاز کنیم.

همه کاری که باید در کد انجام بدهیم همین است! حالا برنامه را اجرا کنید و دکمه DIAL را بزنید و ببینید چه اتفاقی می‌افتد.

android-make-phone-call-and-send-sms-2نکته این جا است که در این حالت برنامه Dialer اجرا شده و شماره‌ای که برای آن مشخص کردیم به عنوان شماره مقصد وارد شده است ولی کاربر خودش باید دکمه تماس را بگیرد. در این حالت کاربر می‌تواند قبل از برقراری تماس شماره را تغییر دهد. اگر بخواهیم برنامه Dialer مستقیماً با شماره مورد نظر تماس بگیرد، نیاز به یک تغییر کوچک در برنامه داریم.

برای برقراری تماس به صورت مستقیم، در قسمت ۵ کد کلاس MainActivity باید یک تغییر کوچک اعمال کنیم و به جای استفاده از عملیات ACTION_DIAL از عملیات ACTION_CALL استفاده کنیم:

// ۵
Intent intent = new Intent(Intent.ACTION_CALL, uri);

در این حالت برنامه Dialer اجرا شده و مستقیماً بدون دخالت کاربر شروع به برقراری تماس با شماره‌ای که در برنامه خودمان وارد کرده‌ایم می‌کند.

اما اگر این برنامه تغییر یافته را اجرا کنیم با زدن دکمه DIAL برنامه خطا داده و بسته می‌شود. چرا؟ به دلیل این که برقراری تماس مستقیم با شماره از داخل برنامه، نیاز به مجوز کاربر دارد و دلیل آن هم واضح است. تماس برقرار کردن مستقیم با یک شماره بدون این که کاربر هیچ دخالتی در آن داشته باشد، ممکن باعث بروز مشکلات و حتا هزینه ناخواسته برای کاربر شود، بنابراین کاربر حتماً باید مجوز این کار را به برنامه داده باشد. برای گرفتن مجوز از کاربر، باید در فایل AndroidManifest برنامه تغییر کوچکی اعمال کنیم و این مجوز را از کاربر درخواست کنیم:

<uses-permission android:name="android.permission.CALL_PHONE"></uses-permission>

حالا برنامه هیچ مشکلی ندارد و اجرا می‌شود.

ارسال پیامک یا اس‌ام‌اس

برای  ارسال پیامک از برنامه اندروید فقط دو راه وجود دارد:

۱- استفاده از برنامه پیش‌فرض پیامک در گوشی

۲- ارسال مستقیم پیامک از برنامه

برای آزمایش هر دوی این روش‌ها باید تغییراتی در برنامه ایجاد کنیم. فایل layout برنامه را به شکل زیر ویرایش کنید:

<!--/ ... /-->
<EditText
        android:id="@+id/et_message"
        android:hint="Enter message"
        android:inputType="textCapSentences|textMultiLine"
        android:maxLength="2000"
        android:maxLines="12"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"/>

<Button
        android:id="@+id/btn_send_message"
        android:layout_gravity="center_horizontal"
        android:text="Send Messange"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"/>
<!--/ ... /-->

شکل کلی صفحه بعد از اضافه کردن عناصر جدید باید شبیه تصویر زیر باشد:

android-make-phone-call-and-send-sms-3

حالا باید تغییراتی در کلاس MainActivity اعمال کنیم:

// ...
Button sendMessageBtn = (Button) findViewById(R.id.btn_send_message);
final EditText messagetEt = (EditText) findViewById(R.id.et_message);
sendMessageBtn.setOnClickListener(new View.OnClickListener() {
    @Override
    public void onClick(View view) {
        // ۱
        String message = messagetEt.getText().toString();

        // ۲
        String phoneNo = mPhoneNoEt.getText().toString();
        if(!TextUtils.isEmpty(message) && !TextUtils.isEmpty(phoneNo)) {
            // ۳
            Uri uri = Uri.parse("smsto:" + phoneNo)

            // ۴
            Intent smsIntent = new Intent(Intent.ACTION_SENDTO, uri);

            // ۵
            smsIntent.putExtra("sms_body", message);

            // ۶
            startActivity(smsIntent);
        }
    }
});
// ...

توضیحات:

۱- ابتدا متنی که کاربر وارد کرده است را از ادیت‌تکست می‌گیریم.

۲- شماره‌ای که قرار است به آن پیامک ارسال کنیم را از EditText مربوطه می‌گیریم.

۳- مثل دفعه قبل، این بار هم یک Uri می‌سازیم که با smsto: شروع می‌شود.

۴- باز هم باید یک Intent بسازیم. این بار عملیات اینتنت ACTION_SENDTO است.

۵- اینتنت ساخته شده برای ارسال پیامک در حال حاضر فقط دارای یک Uri است که در آن شماره مقصد وارد شده است ولی از متن پیامک در این اینتنت خبری نیست. بنابراین یک مقدار «فوق‌العاده» به کلید «sms_body» به این Intent اضافه می‌کنیم. برای این کار از متد putExtra استفاده می‌کنیم.

۶- حالا می‌توانیم این Intent را آغاز کنیم.

بعد از آغاز کردن این Intent برنامه پیش‌فرض ارسال و دریافت پیامک اجرا می‌شود و همانطور که در عکس بالا می‌بینید، شماره و متن از پیش آماده است و کاربر فقط باید دکمه ارسال را بزند.

ارسال مستقیم پیامک:

برای ارسال مستقیم پیامک از برنامه، نیاز به مجوز کاربر دارید. فرض کنید یک برنامه‌ای بدون این که کاربر بداند، وی را در همه برنامه‌های پیامکی پولی عضو کند و هزینه زیادی را روی دست کاربر بگذارد!

برای ارسال مستقیم پیامک، این مجوز را در مانیفست برنامه از کاربر بگیرید:

<uses-permission android:name="android.permission.SEND_SMS"/>

حالا در متد onClick دکمه ارسال پیامک، به جای مراحل ۳ تا ۶ کد زیر را بنویسید:

SmsManager smsManager = SmsManager.getDefault();
smsManager.sendTextMessage(phoneNo, null, message, null, null);

و تمام!

نکته بسیار بسیار بسیار مهم:

البته اگر برنامه خود را برای اندروید ۶ و بالاتر می‌نویسید، کارتان به همین سادگی تمام نخواهد شد! در اندروید ۶ و به بعد، مدل کسب مجوز از کاربر تغییر کرده و برنامه برای بعضی کارها باید در زمان اجرا از کاربر مجوز بگیرد و ارسال مستقیم پیامک هم از آن‌ها است. البته کاربر می‌تواند مجوز ارسال مستقیم پیامک را به برنامه ندهد و این مدیریت تمام جوانب کار را نسبتاً پیچیده می‌کند. به امید خدا در مطلبی جداگانه به موضوع مجوزها در اندروید ۶ به بعد می‌پردازم.

3 فکر می‌کنند “چطور از برنامه اندروید تماس بگیریم یا پیامک بفرستیم

  1. فاطمه

    سلام خسته نباشید من در ارسال مستقیم پیام
    android:name=”android.permission.SEND_SMS”/> در فایل منیفست و

    smsManager = SmsManager.getDefault();
    smsManager.sendTextMessage(phoneNo, null, message, null, null);کد ها رو طبق دستور وارد کردم ولی موقع اجرا فورس کلوز می ده دلیلش چیه

    پاسخ
    1. hh

      سلام در اندروید ۶ به بالا یعنی API23 به بالا باید permission ها رو از کاربر بصورت مستقیم از خود برنامه بگیرید وگر نه ارور فورس کلوز میده

      پاسخ

دیدگاهتان را بنویسید

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