呼出电话
-----------------------------------
【工做机制】
当呼出电话时,系统会发出一个有序广播,而且,将呼叫的电话号码经过setResultData()进行封装,最后,呼叫程序接收到该广播后,实现呼出。
【实现原理】
经过getResultData()获取电话号码,根据自定义的逻辑对号码进行判断,在有必要的时候,经过setResultData()修改电话号码。
权限:android.permission.PROCESS_OUTGOING_CALLS
广播Action:android.intent.action.NEW_OUTGOING_CALLjava
监听短信
-----------------------------------
【工做原理】当新的短信到来时,系统会发出广播,而且将短信的相关数据封装在Intent中。
【实现过程】
权限:android.permission.RECEIVE_SMS
广播Action:android.provider.Telephony.SMS_RECEIVEDandroid
eg:ide
public class SmsReceiver extends BroadcastReceiver { @Override public void onReceive(Context context, Intent intent) { // 日志 Log.d("tag", "SmsReceiver.onReceive()"); // 短信的数据对象 SmsMessage msg; // 从Intent中获取短信的内容,每次收到的短信可能由多条短信组成 Object[] pdus = (Object[]) intent.getExtras().get("pdus"); // 短信的数据 byte[] pdu; // 循环获取的短信内容,即循环时每次读1条短信的数据 for (int i = 0; i < pdus.length; i++) { // 获取短信的数据 pdu = (byte[]) pdus[i]; // 将数据封装为SmsMessage对象 msg = SmsMessage.createFromPdu(pdu); // 获取短信的内容 String address = msg.getOriginatingAddress(); String body = msg.getMessageBody(); Date date = new Date(msg.getTimestampMillis()); // 日志输入显示 Log.d("tag", "address -> " + address); Log.d("tag", "date -> " + date); Log.d("tag", "body -> " + body); } } }
监听来电spa
-----------------------------------
【工做原理】当新的呼叫到来时,系统会发出广播。
【实现过程】
权限:日志
android.permission.READ_PHONE_STATE
android.permission.CALL_PHONE
广播Action:android.intent.action.PHONE_STATE
【挂断电话】
问题1:ITelephony能够实现挂断电话,可是该类型不可识别,则须要自定义ITelephony的aidl文件
问题2:获取ITelephony对象能够经过TelephonyManager的getITelephony()方法获取,可是,该方法是使用private修饰的私有方法
code