ストックダイヤラー(マシュマロ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);
私のアカウントは、標準の Dialer アプリ ([設定] -> [通話] -> [通話アカウント]) 内に表示され、有効にしています。
電話の状態を監視し、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) {.......}
...
}
私のカスタム接続サービス:
@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 のコールバック メソッドが、着信コールと発信コールでそれぞれ呼び出されます。問題は、Dialer に移動して (my を使用してPhoneAccount
) 電話をかけると、正しい発信者情報 (連絡先名、電話番号など) が表示されたダイヤル画面 (inCallUI ?) が表示されますが、回線がイヤホンで が鳴らず、通話が確立されません (通話を受けるはずの電話番号が鳴りません)。
super.onCreateOutgoingConnection(PhoneAccountHandle connectionManagerPhoneAccount, ConnectionRequest request)
独自の Connection オブジェクトを作成する代わりに、コールバックで返そうとしましたが、同じ動作が得られました。
TLDR: 私のアプリは Dialer と通信し、電話をかけ、ダイヤル画面を表示できますが、電話回線が鳴らず、何も起こりません。