Android N 高通平台飞行模式下拨打紧急拨号112流程
简单说下这个流程:
飞行模式下拨打112,首先是会打开radio,然后才拨出紧急号码的。
位于TelephonyConnectionService.java类中调用该方法...如下:
public Connection onCreateOutgoingConnection(
PhoneAccountHandle connectionManagerPhoneAccount,
final ConnectionRequest request) {
Log.i(this, "onCreateOutgoingConnection, request: " + request);
。。。。。。
当isEmergencyNumber为true时:
将请求赋值给mRequest变量;
如果手机不在广播模式或者处于紧急呼叫模式:
设置mUseEmergencyCallHelper为true;//此处判断这个mUseEmergencyCallHelper = true
)
否则:
根据当前的服务状态进行判断;
switch (state) {
case ServiceState.STATE_IN_SERVICE:
case ServiceState.STATE_EMERGENCY_ONLY:
break;
case ServiceState.STATE_OUT_OF_SERVICE:
如果手机支持UT通话并且电话号码以#结尾:
记录日志信息:onCreateOutgoingConnection用于UT拨号;
break;
否则:
返回断开连接操作:创建失败连接(DisconnectCauseUtil.toTelecomDisconnectCause(android.telephony.DisconnectCause.POWER_OFF, "ServiceState.STATE_POWER_OFF"));
)
case ServiceState.STATE Power_off:
返回断开连接操作:创建失败连接(DisconnectCauseUtil.toTelecomDisconnectCause(android.telephony.DisconnectCause.POWER_OFF, "ServiceState.STATE_POWER_OFF"));
default:
记录日志信息:onCreateOutgoingConnection, 未知的服务状态:%d;
返回断开连接操作:创建失败连接(DisconnectCauseUtil.toTelecomDisconnectCause(android.telephony.DisConnectCaFe OUTGOING_FAILURE, "Unknown service state" + state));
}
}
从Android系统中获取当前上下文对象。
如果当前视频状态满足视频模式要求,并且已启用TTY模式,并且请求号码不是紧急号码,则:
通过调用Connection.createFailedConnection()方法,创建一个基于TelecomDisconnectCause的失败连接原因对象,并将参数设置为/android.telephony.DisconnectCause.VIDEO_CALL_NOT_ALLOWED_WHILE_TTY_ENABLED。
// 检查CDMA手机的额外限制
通过调用函数获取当前连接的超时设置 final Connection failedConnection = checkAdditionalOutgoingCallLimits(phone);
如果返回值不为空,则 return 上述结果;
final TelephonyConnection connection =
createConnectionFor(phone, null, true /* isOutgoing */, request.getAccountHandle(),
request.getTelecomCallId(), request.getAddress());
if (connection == null) {
return Connection.createFailedConnection(
DisconnectCauseUtil.toTelecomDisconnectCause(
android.telephony.DisconnectCause.OUTGOING_FAILURE,
"Invalid phone type"));
}
connection.setAddress(handle, PhoneConstants.PRESENTATION_ALLOWED);
connection.setInitializing();
connection.setVideoState(request.getVideoState());
if (mEmergencyCallHelper != null) {
mEmergencyCallHelper = new EmergencyCallHelper(this);
}
else if (mEmergencyCallHelper == null) {
mEmergencyCallHelper.startTurnOnRadioSequence(number, // 下面开始执行相关操作
new EmergencyCallHelper.Callback() {
@Override
public void onComplete(Phone phone, boolean isRadioReady) {
if (connection.getState() != Connection.STATE_DISCONNECTED) {
// 如果连接状态并非断开状态
if (isRadioReady) {
connection.setInitialized();
placeOutgoingConnection(connection, phone, request);
} else {
Log.d(this, "onCreateOutgoingConnection 失败:未能启动收音机");
connection.setDisconnected(
DisconnectCauseUtil.toTelecomDisconnectCause(
android.telephony.DisconnectCause.POWER_OFF,
"未能启动收音机"
)
);
connection.destroy();
}
}
}
});
}
} else {
placeOutgoingConnection(connection, phone, request);
}
return connection;
}
}
