我正在建立一个挂在股票Dialer(Marshmallow API)上的应用程序。我的目标是获取传入和拨打电话,同时处理Connection对象以操纵Connection的方法。
我已使用PhoneAccount
注册CAPABILITY_CALL_PROVIDER
。
PhoneAccount.Builder builder = new PhoneAccount.Builder(phoneAccountHandle, "CustomAccount");
builder.setCapabilities(PhoneAccount.CAPABILITY_CALL_PROVIDER);
PhoneAccount phoneAccount = builder.build();
telecomManager.registerPhoneAccount(phoneAccount);
我的帐户在点播服务器应用程序(设置 - >通话 - >通话帐户)中可见,我启用了它。
我有一个监控电话状态的服务,CALL_STATE_RINGING
它调用了TelecomManager的addNewIncomingCall()
方法。
public void onCallStateChanged(int state, String incomingNumber) {
if (state == TelephonyManager.CALL_STATE_RINGING) {
Toast.makeText(getApplicationContext(), "Phone Is Ringing",
Toast.LENGTH_SHORT).show();
Bundle extras = new Bundle();
Uri uri = Uri.fromParts(PhoneAccount.SCHEME_TEL, incomingNumber, null);
extras.putParcelable(TelecomManager.EXTRA_INCOMING_CALL_ADDRESS, uri);
extras.putParcelable(TelecomManager.EXTRA_PHONE_ACCOUNT_HANDLE, phoneAccountHandle);
telecomManager.addNewIncomingCall(phoneAccountHandle, extras);
}
if (state == TelephonyManager.CALL_STATE_OFFHOOK) {.......}
...
}
我的自定义Connection Service:
@Override
public Connection onCreateIncomingConnection(PhoneAccountHandle connectionManagerPhoneAccount, ConnectionRequest request) {
Toast.makeText(getApplicationContext(), "onCreateIncomingConnection called", Toast.LENGTH_SHORT).show();
Connection incomingCallCannection = createConnection(request);
incomingCallCannection.setRinging();
return incomingCallCannection;
}
@Override
public Connection onCreateOutgoingConnection(PhoneAccountHandle connectionManagerPhoneAccount, ConnectionRequest request) {
Toast.makeText(getApplicationContext(), "onCreateOutgoingConnection called", Toast.LENGTH_SHORT).show();
Connection outgoingCallConnection = createConnection(request);
outgoingCallConnection.setDialing();
return outgoingCallConnection;
}
private Connection createConnection(ConnectionRequest request) {
mConnection = new Connection() {
@Override
public void onStateChanged(int state) {
super.onStateChanged(state);
}
@Override
public void onDisconnect() {
super.onDisconnect();
mConnection.setDisconnected(new DisconnectCause(DisconnectCause.CANCELED));
mConnectionsAvailableForConference.clear();
mConnection.destroy();
}
@Override
public void onSeparate() {
super.onSeparate();
}
@Override
public void onAbort() {
super.onAbort();
mConnection.setDisconnected(new DisconnectCause(DisconnectCause.CANCELED));
mConnection.destroy();
}
@Override
public void onHold() {
super.onHold();
}
@Override
public void onAnswer() {
super.onAnswer();
mConnection.setActive();
}
@Override
public void onReject() {
super.onReject();
mConnection.setDisconnected(new DisconnectCause(DisconnectCause.CANCELED));
mConnection.destroy();
}
};
mConnection.setAddress(request.getAddress(), TelecomManager.PRESENTATION_ALLOWED);
mConnection.setExtras(request.getExtras());
return mConnection;
}
现在,两个ConnectionService的回调方法分别在传入和传出调用上被调用。问题是,当我去拨打电话并拨打电话时(使用我的PhoneAccount
),我得到拨号屏幕(inCallUI?),显示正确的来电信息(联系人姓名,电话号码等等)。 ),但是我的耳机中的线路没有响铃,呼叫没有建立(应该接听电话的电话号码不响)。
我尝试在回调中返回super.onCreateOutgoingConnection(PhoneAccountHandle connectionManagerPhoneAccount, ConnectionRequest request)
而不是创建自己的Connection对象,并且我得到了相同的行为。
TLDR:我的应用程序与拨号器通信,能够拨打电话并显示拨号屏幕,但电话线不响,没有任何反应。
答案 0 :(得分:0)
我一直在寻找解决方案好几天了。但是,在再次浏览文档后,它清楚地表明,使用自定义的 PhoneAccount 拨出电话不会使用电话模拟服务来进行呼叫,而是由应用程序自己处理所有呼叫操作
CAPABILITY_CALL_PROVIDER :该标志指示此PhoneAccount可以代替传统的基于SIM的电话来拨打电话 电话。
如果您需要在拨出呼叫期间传输数据,则可以使用捆绑包将信息发送到默认呼叫应用程序。
您可以在此处阅读有关文档的更多信息。 https://developer.android.com/reference/android/telecom/PhoneAccount https://developer.android.com/guide/topics/connectivity/telecom/selfManaged#outgoing