Telefonia

Preview:

Citation preview

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

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 telefoneTelephonyManager 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 ImportantesMétodo Descrição Retorno

getPhoneType() Tipo do telefonePHONE_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

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

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

Enviando uma Mensagem de Texto

• O método sendTextMessage() é usadosmsMgr.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

Broadcast Receiverpublic 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