Î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.
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..
Activați Android Studio și creați un nou proiect cu o activitate goală numită Activitate principala
.
Deocamdată, aspectul nostru va avea doar unul Editează textul
câmp și a cadran buton:
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.
Î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:
Avem nevoie de permisiune READ_PHONE_STATE
pentru a putea monitoriza starea telefonului. Adăugați-o la AndroidManifest.xml:
PhoneStateListener
ObiectNoi 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 ()
.
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_LOCATION
, LISTEN_SIGNAL_STRENGTH
, LISTEN_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.
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.
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;
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
.
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 +:
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.
Î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.
Î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.
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ă.
Înainte să vedem cum să trimitem SMS-ul direct din aplicația noastră în loc să folosim clientul SMS al dispozitivului.
Ca de obicei, trebuie să vă înregistrați permisiunea AndroidManifest.xml.
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_FAILURE
, RESULT_ERROR_RADIO_OFF
, și RESULT_ERROR_NULL_PDU
pentru a indica o eroare.
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.
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); // ...
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.
În acest tutorial, ați aflat despre:
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!