13.1.2 通话的处理
在Android中,android.telephony.TelephonyManager对象是开发者获取当前通话网络相关信息的窗口,通过TelephonyManager对象可以查看当前的通话状态、SIM卡的信息等相关内容:
//获得TelephonyManager对象
TelephonyManager telManager=(TelephonyManager)
getSystemService(Context.TELEPHONY_SERVICE);
//获得通话网络类型信息
int phoneType=telManager.getPhoneType();
if(phoneType==TelephonyManager.PHONE_TYPE_GSM){
…//如果是gsm网络,则处理相关事宜
}
//获得通话状态
int callState=telManager.getCallState();
if(callState==TelephonyManager.CALL_STATE_IDLE){
…//如果未在通话中,则处理相关事宜
}
…//还可以获得更多的相关信息
此外,使用TelephonyManager.listen函数,可以注册android.telephony.PhoneStateListener对象来实时监听通话状态的变更情况,使得应用有机会对通话状态进行辅助处理。比如,利用PhoneStateListener对象可以监控来电信息,实时查询来电的归属地:
//构造PhoneStateLister子类来处理相关事件
public class MyListener extends PhoneStateListener{
public onCallStateChanged(
int state, String incomingNumber){
if(state==TelephonyManager.CALL_STATE_RINGING){
…//处理来电事件
}
}
}
…
//开始监听电话状态的变更情况
TelephonyManager telManager=(TelephonyManager)
getSystemService(Context.TELEPHONY_SERVICE);
telManager.listen(new MyListener(),
PhoneStateListener.LISTEN_CALL_STATE);
出于安全性的考虑,Android并没有将拨号呼叫、接听电话等通话控制的接口暴露给开发者。如果在应用中需要拨打电话,则需要构造Intent对象调用通话应用来实现:
final Uri phone=Uri.parse("tel:1234567");
//一种方式是调用拨号组件
startActivity(new Intent(Intent.ACTION_DIAL, phone));
//或者也可以直接拨号
startActivity(new Intent(Intent.ACTION_CALL, phone));
如实例中所示,action为Intent.ACTION_CALL的Intent请求用于请求直接拨号,而action为Intent.ACTION_DIAL的请求,则是期望通话应用将需要拨打的号码给用户查看和确认。在Android中,通常会使用Intent.ACTION_DIAL构造Intent对象来发起拨号请求,以避免用户在不知情的情况下拨通而浪费通话费用。