Cum să efectuați apeluri și să utilizați SMS-uri în aplicațiile Android

În acest tutorial, veți afla despre API-ul de telefonie Android și SMS. Veți învăța cum să efectuați un apel din aplicația dvs. și cum să monitorizați evenimentele de apel telefonic, precum și modul de trimitere și primire a SMS-urilor.

1. Cum se face un apel 

Pentru a începe, vă vom arăta cum să inițiați un apel din aplicația dvs. fie utilizând aplicația de apelare telefonică, fie direct din aplicația dvs. pentru a ușura utilizatorii dvs..

Creați un nou proiect Android Studio

Activați Android Studio și creați un nou proiect cu o activitate goală numită Activitate principala.


Așezați ecranul

Deocamdată, aspectul nostru va avea doar unul Editează textul câmp și a cadran buton:

   

Modificați Activitate principala Clasă

În blocul de cod de mai jos, creăm un ACTION_DIAL intenția de a afișa dialerul telefonului. Numărul de telefon este analizat de la noi tel Schema URI: tel: XXXXXXXX. Rețineți că nu aveți nevoie de permisiuni pentru ca aceasta să funcționeze:

import șiroid.content.Intent; importul android.net.Uri; import android.os.Bundle; import șiroid.support.v7.app.AppCompatActivity; import șiroid.text.TextUtils; import șiroid.view.View; import șiroid.widget.Button; importă android.widget.EditText; importă android.widget.Toast; clasa publica MainActivity extinde AppCompatActivity @Override protejat void onCreate (Bundle savedInstanceState) super.onCreate (savedInstanceState); setContentView (R.layout.activity_main); Butonul mDialButton = (buton) findViewById (R.id.btn_dial); finală EditText mPhoneNoEt = (EditText) findViewById (R.id.et_phone_no); mDialButton.setOnClickListener (noul View.OnClickListener () @Override public void onClick (Vizualizare vizualizare) String phoneNo = mPhoneNoEt.getText () .toString (), if (! TextUtils.isEmpty (phoneNo)) String dial = : "+ phoneNo; startActivity (Intent nou (Intent.ACTION_DIAL, Uri.parse (dial))); altceva Toast.makeText (MainActivity.this," Introduceți un număr de telefon ", Toast.LENGTH_SHORT) .show (); ); 

Dacă rulați aplicația și faceți clic pe butonul de apelare, veți fi dus la aplicația de apelare și de acolo trebuie să formați numărul. Puteți schimba acest flux pentru a efectua efectiv apelul din aplicația dvs., schimbând pur și simplu ACTION_DIAL intenționez să ACTION_CALL in schimb. Acest lucru va necesita android.permission.CALL_PHONE permisiune, totuși. 

2. Monitorizarea evenimentelor telefonice

În această secțiune, vom învăța cum să monitorizăm evenimentele de apel telefonic în sistemul Android. Telefonul poate fi în trei stări: 

  1. inactiv (atunci când nu este folosit)
  2. sonerie (când există un apel primit)
  3. off-cârlig (când se răspunde la apel)

Adăugați permisiunea 

Avem nevoie de permisiune READ_PHONE_STATE pentru a putea monitoriza starea telefonului. Adăugați-o la AndroidManifest.xml:

Creați PhoneStateListener Obiect

Noi cream un obiect al PhoneStateListener clasa, apoi suprascrie onCallStateChanged () (în IntelliJ este ușor să faceți acest lucru cu Control-O, apoi selectați sau căutați metoda de suprascriere). Vom rezolva modificările la modificările stării apelului afișând a Paine prajita. Rețineți că putem accesa, de asemenea, numerele de telefon primite atunci când această metodă este declanșată:

// ... TelefonStateListener mPhoneStateListener = nouNameName () @Override public void onCallStateChanged (stare int, String incomingNumber) super.onCallStateChanged (state, incomingNumber); comutare (stat) caz TelephonyManager.CALL_STATE_IDLE: Toast.makeText (MainActivity.this, "CALL_STATE_IDLE", Toast.LENGTH_SHORT) .show (); pauză; cazul TelephonyManager.CALL_STATE_RINGING: Toast.makeText (MainActivity.this, "CALL_STATE_RINGING", Toast.LENGTH_SHORT) .show (); pauză; cazul TelephonyManager.CALL_STATE_OFFHOOK: Toast.makeText (MainActivity.this, "CALL_STATE_OFFHOOK", Toast.LENGTH_SHORT) .show (); pauză; ; // ... 

În funcție de nevoile dvs. de aplicație, puteți de asemenea să înlocuiți una dintre aceste alte metode de eveniment: onCellInfoChanged ()onCallForwardingIndicatorChanged ()onCellLocationChanged (), sau onSignalStrengthChanged ().

Ascultarea stării de apel telefonic

Pentru a începe să ascultați starea apelului telefonic, trebuie să obțineți TelephonyManager din serviciul de sistem și inițializați-l onCreate ().

// ... privat TelephonyManager mTelephonyManager; @Override protejat void onCreate (Bundle savedInstanceState) // ... mTelephonyManager = (TelephonyManager) getSystemService (getApplicationContext () .TELEPHONY_SERVICE); 

În onResume () metoda, putem începe să ascultăm folosind TelephonyManager asculta() metodă, trecând-o PhoneStateListener exemplu și statică LISTEN_CALL_STATE. Încetează să mai ascultăm în onStop () metoda prin trecerea lui LISTEN_NONE ca al doilea argument asculta().

// ... @Override protejat void onResume () super.onResume (); mTelephonyManager.listen (mPhoneStateListener, PhoneStateListener.LISTEN_CALL_STATE);  @Override protejate void onStop () super.onStop (); mTelephonyManager.listen (mPhoneStateListener, PhoneStateListener.LISTEN_NONE);  // ... 

Sunt posibile și alte opțiuni de ascultare a telefonului LISTEN_CELL_LOCATIONLISTEN_SIGNAL_STRENGTHLISTEN_CALL_FORWARDING_INDICATOR, și LISTEN_CELL_INFO.

În cele din urmă, rulați aplicația și asigurați-vă că soseste un apel primit. 

Această monitorizare va funcționa numai atunci când aplicația se află în prim-plan. Pentru ca acest lucru să funcționeze în fundal (atunci când cererea noastră nu este executată), ar trebui să creați o BroadcastReceiver astfel încât, chiar dacă aplicația nu se execută, putem continua să monitorizăm starea apelurilor telefonice. În funcție de cerințele aplicației dvs., aceasta ar putea fi o modalitate mult mai bună de a asculta schimbările de stare ale apelurilor telefonice. Vă voi arăta cum să faceți acest lucru în secțiunea următoare.

Rețineți că monitorizăm doar apelurile primite. Pentru ca noi să monitorizăm apelurile efectuate, avem nevoie de permisiuni suplimentare. Pentru a monitoriza apelurile efectuate, includeți următoarea linie în agenda dvs. AndroidManifest.xml fişier.

 

Cum să utilizați emulatorul pentru a efectua apeluri și a trimite mesaje SMS

Puteți utiliza emulatorul pentru a simula efectuarea unui apel sau trimiterea unui mesaj SMS, dar va trebui să faceți o mică configurare. Deschideți emulatorul, faceți clic pe ultimul buton din bara de navigare din dreapta pentru a deschide dialogul de control extins și apoi selectați butonul de control al telefonului. 

3. Monitorizarea evenimentelor telefonice din fundal

Creați un BroadcastReceiver

La fel ca în secțiunea anterioară, trebuie să creăm un ascultător de evenimente pentru a monitoriza modificările de stare ale telefonului. Diferența majoră este că de data aceasta vom extinde BroadcastReceiver de bază, astfel încât să putem asculta starea apelului telefonic chiar dacă aplicația nu rulează. Asigurați-vă că nu vă înregistrați mai mult de o dată pe ascultător! Cecul nostru pentru asta este pe linia 36.

import șiroid.content.BroadcastReceiver; importați android.content.Context; import șiroid.content.Intent; import android.telephony.PhoneStateListener; import android.telephony.TelephonyManager; importă android.widget.Toast; clasa publica PhoneCallStateReceiver extinde BroadcastReceiver private TelephonyManager mTelephonyManager; public static boolean isListening = false; @Override public void onReceive (contextul contextului final, Intent intent) mTelephonyManager = (TelephonyManager) context.getSystemService (context.TELEPHONY_SERVICE); PhoneStateListener mPhoneStateListener = nouSetul de numere al telefonului () @Override public void onCallStateChanged (stare int, string incomingNumber) super.onCallStateChanged (state, incomingNumber); comutare (stat) caz TelephonyManager.CALL_STATE_IDLE: Toast.makeText (context, "CALL_STATE_IDLE", Toast.LENGTH_SHORT) .show (); pauză; caz TelephonyManager.CALL_STATE_RINGING: Toast.makeText (context, "CALL_STATE_RINGING", Toast.LENGTH_SHORT) .show (); pauză; cazul TelephonyManager.CALL_STATE_OFFHOOK: Toast.makeText (context, "CALL_STATE_OFFHOOK", Toast.LENGTH_SHORT) .show (); pauză; ; dacă (! isListening) mTelephonyManager.listen (mPhoneStateListener, PhoneStateListener.LISTEN_CALL_STATE); isListening = true; 

Modifica AndroidManifest.xml

Un receptor difuzat funcționează numai dacă este înregistrat. Trebuie să spunem sistemului Android despre receptorul nostru de emisie înregistrându-l în AndroidManifest.xml fișier prin conectarea noastră PhoneCallStateReceiver clasa la care descrie sistemul de difuzare pe care dorim să-l primim - în acest caz, PHONE_STATE.

    

Monitorizarea apelurilor efectuate

Pentru apelurile efectuate, trebuie să includeți NEW_OUTGOING_CALL intenția de acțiune  în a receptorului în AndroidManifest.xml

Pentru a obține numărul de telefon al apelului destinat de ieșire, în interiorul onReceive (Context, Intent) metoda, obținem numărul din intenție ca extra. Pentru a împiedica efectuarea apelului dorit, putem apela setResultData () și să-i dați un argument nul. resultData este utilizat ca număr real de apelat. 

@Override public void onReceive (contextul final de context, Intent intent) // pentru apelul de ieșire String outgoingPhoneNo = intent.getStringExtra (Intent.EXTRA_PHONE_NUMBER) .toString (); // împiedica apelul de ieșire setResultData (null); 

Puteți afla mai multe despre emisiunile și receptoarele de difuzare din tutorialul nostru aici pe Envato Tuts +:

4. Trimiterea mesajelor SMS

Aveți doar două opțiuni majore pentru trimiterea SMS-urilor: utilizând aplicația client SMS a dispozitivului sau sărind peste client trimiterea SMS direct din aplicația dvs. Vom analiza ambele scenarii și puteți decide care dintre ele este mai bine pentru cazul dvs. de utilizare. Să începem prin trimiterea unui SMS utilizând clientul SMS al dispozitivului.

Configurați aspectul

În primul rând, trebuie să modificăm structura noastră principală pentru a avea un Editează textul câmp pentru mesaj și a Trimite mesaj buton.

  

Modificați MainActivity 

În interiorul nostru onCreate () în metoda noastră Activitate principala clasă, creați o intenție cu ACTION_SENDTO ca primul argument și a smsto: URI ca al doilea argument. Mesajul text va fi valoarea lui sms_body suplimentar: 

// ... butonul sendMessageBtn = (butonul) findViewById (R.id.btn_send_message); finală EditText messagetEt = (EditText) findViewById (R.id.et_message); sendMessageBtn.setOnClickListener (new View.OnClickListener () @Override public void onClick (Vizualizare vizualizare) String message = messagetEt.getText () .toString (); String phoneNo = mPhoneNoEt.getText (). TextUtils.isEmpty (mesaj) &&! TextUtils.isEmpty (phoneNo)) Intenție smsIntent = intenție nouă (Intent.ACTION_SENDTO, Uri.parse ("smsto:" + phoneNo)) smsIntent.putExtra ("sms_body"; startActivity (smsIntent);); // ... 

Aici clientul SMS va monitoriza starea livrării mesajelor. 

Rulați aplicația

Când sunt introduse toate câmpurile obligatorii, faceți clic pe Trimite SMS butonul va deschide clientul SMS al utilizatorului sau va oferi utilizatorilor opțiuni pentru a selecta o aplicație dacă nu a fost deja aleasă.

5. Trimiterea mesajelor SMS direct

Înainte să vedem cum să trimitem SMS-ul direct din aplicația noastră în loc să folosim clientul SMS al dispozitivului. 

Adăugați permisiunea în AndroidManifest.xml

Ca de obicei, trebuie să vă înregistrați permisiunea AndroidManifest.xml.

 

Modificați clasa MainActivity 

Apoi, pentru Android 6.0 (nivel 23 API) și mai sus, trebuie să solicităm TRIMITE SMS permisiune în timpul rulării. 

Pentru a afla mai multe despre permisiunile de rulare pe Android și despre modul în care s-au schimbat în versiunea 6.0, consultați tutorialul nostru aici pe Envato Tuts +:

Pentru a trimite un SMS, primim implicit SmsManager și apoi să-i numiți Trimite mesaj text() metodă, trecând numărul de telefon ca primul argument și mesajul ca al doilea argument:

// ... final int SEND_SMS_PERMISSION_REQUEST_CODE = 111; butonul privat mSendMessageBtn; @Override protejat void onCreate (Bundle savedInstanceState) // ... mSendMessageBtn = (buton) findViewById (R.id.btn_send_message); finală EditText messagetEt = (EditText) findViewById (R.id.et_message); mSendMessageBtn.setEnabled (false); dacă (checkPermission (Manifest.permission.SEND_SMS)) mSendMessageBtn.setEnabled (true);  altceva ActivityCompat.requestPermissions (aceasta, noul String [] Manifest.permission.SEND_SMS, SEND_SMS_PERMISSION_REQUEST_CODE);  mSendMessageBtn.setOnClickListener (noul View.OnClickListener () @Override public void onClick (Vizualizare vizualizare) String message = messagetEt.getText () toString (); String phoneNo = mPhoneNoEt.getText ! TextStils.isEmpty (mesaj) &&! TextUtils.isEmpty (phoneNo)) if (checkPermission (Manifest.permission.SEND_SMS)) SmsManager smsManager = SmsManager.getDefault (); smsManager.sendTextMessage (phoneNo, null); altceva Toast.makeText (MainActivity.this, "Permisiune refuzată", Toast.LENGTH_SHORT) .show (););  privat boolean checkPermission (permisiune de coardă) int checkPermission = ContextCompat.checkSelfPermission (aceasta, permisiune); întoarcere (checkPermission == PackageManager.PERMISSION_GRANTED);  @Override public void onRequestPermissionsResult (int requestCode, @NonNull String [] permisiuni, @NonNull int [] grantResults) comutare (requestCode) caz SEND_SMS_PERMISSION_REQUEST_CODE: if (grantResults.length> 0 && (grantResults [0] == PackageManager .PERMISSION_GRANTED)) mSendMessageBtn.setEnabled (adevărat);  întoarcere;  // ... 

Pentru a monitoriza starea livrării, SMSManager Trimite mesaj text() metoda are două opțiuni PendingIntent parametri: sentIntent și deliveryIntent.

void sendTextMessage (Adresă de destinație șir, String scAddress, Text șir, PendingIntent sentIntent, PendingIntent deliveryIntent)

Dacă doriți să utilizați sentIntent, urmăriți codul rezultat Activity.RESULT_OK pe succes sau pe unul dintre RESULT_ERROR_GENERIC_FAILURERESULT_ERROR_RADIO_OFF, și RESULT_ERROR_NULL_PDU pentru a indica o eroare.

6. Primirea unui mesaj SMS

Pentru ca aplicația dvs. să înceapă să primească mesaje SMS de pe telefonul utilizatorului, este cel mai bine să aveți un receptor de emisie înregistrat, astfel încât acesta să poată fi alertat când sosește un SMS nou, chiar dacă aplicația dvs. nu rulează în prim-plan. 

Adăugați permisiunea 

Adaugă RECEIVE_SMS permisiune de a AndroidManifest.xml:

Apoi, trebuie să verificăm și să vedem dacă aplicația are permisiunea de a primi mesaje SMS în timpul rulării. Deci, în Activitate principala clasa, verificați pentru RECEIVE_SMS permisiune. Dacă nu este găsit, cereți-l.

// ... @ Override protejat void onCreate (Bundle savedInstanceState) // ... if (! CheckPermission (Manifest.permission.RECEIVE_SMS)) ActivityCompat.requestPermissions (acest nou string [] Manifest.permission.RECEIVE_SMS, 222);  // ... 

Creați un Receiver de difuzare

Obținem fiecare obiect din SmsMessage clasa prin utilizarea metodei createFromPdu (byte [] pdu), trecând un PDU (unitatea de date protocol). Apoi îl adăugăm la matricea mesajelor noastre. 

Pentru a sprijini API 23 și mai sus, trebuie să includeți formatul String extra (fie "3gpp" pentru mesajele GSM / UMTS / LTE în format 3GPP, fie "3gpp2" pentru mesajele CDMA / LTE în format 3GPP2). 

import șiroid.content.BroadcastReceiver; importați android.content.Context; import șiroid.content.Intent; import șiroid.os.Build; import android.os.Bundle; importand android.telephony.SmsMessage; importă android.widget.Toast; clasa publică SMSReceiver extinde BroadcastReceiver @Override public void onReceive (Context context, intent intent) Bundle bundle = intent.getExtras (); dacă (pachet! = null) Obiect [] pdus = (Obiect []) bundle.get ("pdus"); String format = bundle.getString ("format"); finală SmsMessage [] messages = new SmsMessage [pdus.length]; pentru (int i = 0; i < pdus.length; i++)  if(Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) mesaje [i] = SmsMessage.createFromPdu ((octet []) pdus [i], format);  altceva messages [i] = SmsMessage.createFromPdu ((byte []) pdus [i]);  String senderPhoneNo = mesaje [i] .getDisplayOriginatingAddress (); Toast.makeText (context, "Mesaj" + mesaje [0] .getMessageBody () + ", din" + senderPhoneNo, Toast.LENGTH_SHORT) .show (); 

Acum, rulați aplicația, închideți-o și trimiteți-vă telefonului emulat un SMS.

Concluzie

În acest tutorial, ați aflat despre:

  • efectuând un apel din aplicația dvs.
  • monitorizarea evenimentelor apelurilor telefonice
  • trimiterea de mesaje SMS utilizând aplicația de mesagerie a dispozitivului sau direct din propria aplicație
  • primirea de mesaje SMS în fundal

Există multe altele pe care le puteți face cu apelurile telefonice și mesajele SMS în Android. Accesați documentația API Android Telephony și documentația API SMSManager pentru a afla mai multe. 

Între timp, verificați unele dintre celelalte postări ale noastre privind dezvoltarea Android!

  • Senzori Android în profunzime: proximitate și giroscop

    Giroscoapele și senzorii de proximitate sunt disponibili pe majoritatea telefoanelor Android astăzi. Folosindu-le creativ, puteți adăuga utilizatorilor dvs. o nouă dimensiune ...
    Ashraff Hathibelagal
    Android SDK
  • 6 Do și Don'ts pentru o mare experiență de utilizator Android

    Cele mai populare aplicații Android au ceva în comun: toate oferă o experiență extraordinară pentru utilizatori. În acest post, voi împărtăși câteva sfaturi care vă vor ajuta să aplicați ...
    Jessica Thornsby
    Android SDK
  • Audio de fundal în Android Cu MediaSessionCompat

    Una dintre cele mai populare utilizări pentru dispozitivele mobile este redarea audio prin servicii de streaming muzical, podcast-uri descărcate sau orice alt număr de audio ...
    Paul Trebilcox-Ruiz
    Android SDK
  • Migrați un App Android la Designul Materialului

    Cu ani în urmă, când Android era încă un sistem de operare mobil, a fost destul de notoriu pentru interfața sa de utilizator urâtă. Deoarece nu exista nici un design ...
    Ashraff Hathibelagal
    Android
Cod