4

ストックダイヤラー(マシュマロ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_RINGINGTelecomManager の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 と通信し、電話をかけ、ダイヤル画面を表示できますが、電話回線が鳴らず、何も起こりません。

4

1 に答える 1