O documento discute a API de telefonia e SMS do Android, abordando como fazer e receber ligações, trabalhar com o TelephonyManager, enviar e receber mensagens de texto usando intents, SMSManager e broadcast receivers.
1. 1
Android
API de Telefonia e SMS
Tópicos Abordados
• Telefonia
• Fazendo ligações
• Telephony Manager
• Trabalhando com eventos do telefone
• SMS
• Enviar mensagens de texto
• Receber mensagens de texto
Fazendo Ligações
• Para realizar uma ligação, basta enviar ao
Android uma intent cuja action é
ACTION_DIAL, com uma URI que representa o
número a ser discado
Uri uri = Uri.parse("tel:555-3344");
Intent i = new Intent(Intent.ACTION_DIAL, uri);
startActivity(i);
2. 2
Fazendo Ligações
• Uma alternativa é usar a intent ACTION_CALL
• Faz a discagem direta, sem confirmação
• É preciso de declarar a permissão
CALL_PHONE
Uri uri = Uri.parse("tel:555-3344");
Intent i = new Intent(Intent.ACTION_CALL, uri);
startActivity(i);
<uses-permission
android:name="android.permission.CALL_PHONE" />
Telephony Manager
• Permite acessar as propriedades do telefone
TelephonyManager tm =
(TelephonyManager) getSystemService(Context.TELEPHONY_SERVICE);
• É preciso de permissão para ler as
propriedades do telefone
<uses-permission
android:name="android.permission.READ_PHONE_STATE" />
Métodos Importantes
Método Descrição Retorno
getPhoneType() Tipo do telefone
PHONE_TYPE_CDMA
PHONE_TYPE_GSM
PHONE_TYPE_NONE
getDataActivity()
Atividade de transferência
de dados
DATA_ACTIVITY_IN
DATA_ACTIVITY_OUT
DATA_ACTIVITY_INOUT
DATA_ACTIVITY_NONE
getDataState()
Estado da conexão de
dados
DATA_CONNECTED
DATA_CONNECTING
DATA_DISCONNECTED
DATA_SUSPENDED
getSimState()
Estado do cartão SIM do
aparelho
SIM_STATE_ABSENT
SIM_STATE_NETWORK_LOCKED
SIM_STATE_PIN_REQUIRED
SIM_STATE_PUK_REQUIRED
SIM_STATE_UNKNOWN
SIM_STATE_READY
3. 3
Métodos Importantes
Método Descrição Retorno
getNetworkType() Tipo da rede de conexão
NETWORK_TYPE_1xRTT
NETWORK_TYPE_CDMA
NETWORK_TYPE_EDGE
NETWORK_TYPE_EVDO_0
NETWORK_TYPE_EVDO_A
NETWORK_TYPE_EVDO_B
NETWORK_TYPE_GPRS
NETWORK_TYPE_HSDPA
NETWORK_TYPE_HSPA
NETWORK_TYPE_HSUPA
NETWORK_TYPE_IDEN
NETWORK_TYPE_UMTS
NETWORK_TYPE_UNKNOWN
Recebendo Eventos do Telefone
• Sua aplicação pode ser notificada a respeito
de mudanças que ocorrem com relação à
telefonia
• Mudança na força do sinal
• Telefone tocando
• Tráfego de dados
• etc.
• Para receber os eventos, é necessário invocar
o método listen() e passar uma instância de
PhoneStateListener
Exemplo de Registro de Evento
• O primeiro passo é criar uma subclasse de
PhoneStateListener
PhoneStateListener listener = new PhoneStateListener() {
public void onCallStateChanged(int state, String incomingNumber) {
if (state == TelephonyManager.CALL_STATE_RINGING) {
//fazer alguma coisa
}
}
public void onSignalStrengthsChanged(SignalStrength strength) {
int nivel = strength.getGsmSignalStrength();
//fazer alguma coisa
}
};
4. 4
Exemplo de Registro de Evento
• Depois basta registrar o interesse em ser
notificado através do método listen() do
objeto TelephonyManager
|
tm.listen(listener,
PhoneStateListener.LISTEN_CALL_STATE |
PhoneStateListener.LISTEN_SIGNAL_STRENGTHS);
Usar o OR binário para
indicar em quais eventos há
o interesse
Para cada método
sobrescrito existe uma
constante correspondente
tm.listen(listener,
PhoneStateListener.LISTEN_NONE);
Remove os listeners
Enviando SMS
• A maneira mais simples de enviar SMS no
Android é utilizar a própria aplicação nativa de
envio de SMS
• Basta utilizar uma intent
Uri uri = Uri.parse("sms:555-5555");
Intent i = new Intent(Intent.ACTION_SENDTO, uri);
i.putExtra("sms_body", "Mensagem SMS");
startActivity(i);
A Classe SMSManager
• Ao invés de utilizar a aplicação nativa do
Android para enviar SMS, também é possível
utilizar a classe SMSManager.
• É preciso definir uma permissão
SmsManager smsMgr = SmsManager.getDefault();
<uses-permission
android:name="android.permission.SEND_SMS" />
5. 5
Enviando uma Mensagem de Texto
• O método sendTextMessage() é usado
smsMgr.sendTextMessage("555-5555", null, "Oi", null, null);
• É possível também dividir a mensagem em
várias partes
ArrayList<String> msgs =
smsMgr.divideMessage("Mensagem Grande");
smsMgr.sendMultipartTextMessage("555-5555", null, msgs,
null, null);
Recebendo Mensagens
• O Android pode notificar as aplicações
interessadas quando uma mensagem de texto
é recebida
• Um broadcast é enviado
• android.provider.Telephony.SMS_RECEIVED
• Basta registrar um broadcast receiver
• Também é preciso declarar uma permissão
<uses-permission
android:name="android.permission.RECEIVE_SMS" />
Broadcast Receiver
• É possível registrar um broadcast receiver para
ser executado quando uma mensagem chega
<receiver android:name=".SMSListener">
<intent-filter>
<action
android:name="android.provider.Telephony.SMS_RECEIVED" />
</intent-filter>
</receiver>
6. 6
Broadcast Receiver
public class SMSListener extends BroadcastReceiver {
public void onReceive(Context context, Intent intent) {
Bundle bundle = intent.getExtras();
if (bundle != null) {
Object[] pdus = (Object[]) bundle.get("pdus");
for (int i = 0; i < pdus.length; i++) {
SmsMessage sms = SmsMessage.createFromPdu((byte[]) pdus[i]);
String remetente = sms.getOriginatingAddress();
String texto = sms.getMessageBody();
}
}
}
}
Colocando em Prática...
Agora que você já
aprendeu a teoria,
acesse as vídeo-aulas
práticas e pratique os
assuntos abordados
neste módulo!
Clique aqui para acessar as vídeo-aulas práticas