web-dev-qa-db-ja.com

Android

発信呼び出しが応答されたことを検出するために、PhoneStateListenerを作成し、TelephonyManagerの_CALL_STATE_RINGING_、_CALL_STATE_OFFHOOK_、および_CALL_STATE_IDLE_を-からリッスンしてみました この質問 ですが、以下で説明するように、動作しないようです。

まず、マニフェストに次の許可を登録しました。

_<uses-permission Android:name="Android.permission.PROCESS_OUTGOING_CALLS" />
_

次に、BroadcastReceiverと呼ばれるOutCallLoggerが、発信呼び出しが行われるたびに_NEW_OUTGOING_CALL_イベントをキャッチします。

_<receiver Android:name=".listener.OutCallLogger">
    <intent-filter>
        <action Android:name="Android.intent.action.NEW_OUTGOING_CALL" />
    </intent-filter>
</receiver>
_

次に、OutCallLoggerの実装。 noCallListenerYetというブール値を設定して、onReceive()が呼び出されるたびに、新しいPhoneStateListenerTelephonyManagerにアタッチしないようにします。

_public class OutCallLogger extends BroadcastReceiver {

    private static boolean noCallListenerYet = true;

    @Override
    public void onReceive(final Context context, Intent intent) {
        number = intent.getStringExtra(Intent.EXTRA_PHONE_NUMBER);
        if (noCallListenerYet) {
            final TelephonyManager tm = (TelephonyManager) context.getSystemService(
                    Context.TELEPHONY_SERVICE);
            tm.listen(new PhoneStateListener() {
                @Override
                public void onCallStateChanged(int state, String incomingNumber) {
                    switch (state) {
                        case TelephonyManager.CALL_STATE_RINGING:
                            Log.d(This.LOG_TAG, "RINGING");
                            break;
                        case TelephonyManager.CALL_STATE_OFFHOOK:
                            Log.d(This.LOG_TAG, "OFFHOOK");
                            break;
                        case TelephonyManager.CALL_STATE_IDLE:
                            Log.d(This.LOG_TAG, "IDLE");
                            break;
                        default:
                            Log.d(This.LOG_TAG, "Default: " + state);
                            break;
                    }
                }
            }, PhoneStateListener.LISTEN_CALL_STATE);
            noCallListenerYet = false;
        }
    }

}
_

現在、デバイスで発信コールを行うと、_CALL_STATE_RINGING_が呼び出されることはありません。常に「IDLE」から「他の回線が鳴り始めると「OFFHOOK」、通話に応答があると何も表示されず、通話が終了すると再び「IDLE」が出力されます。

Androidで発信通話が応答されたことを確実に検出するにはどうすればよいですか、それは可能ですか?

25
Matthew Quiros

Android 5.0以降、これはシステムアプリで可能です。ただし、非表示のAndroid APIを使用する必要があります。

私はそれを次のように機能させました:

<uses-permission Android:name="Android.permission.READ_PRECISE_PHONE_STATE" />
<receiver Android:name=".listener.OutCallLogger">
    <intent-filter>
        <action Android:name="Android.intent.action.PRECISE_CALL_STATE" />
    </intent-filter>
</receiver>
public class OutCallLogger extends BroadcastReceiver {

    @Override
    public void onReceive(Context context, Intent intent) {
        switch (intent.getIntExtra(TelephonyManager.EXTRA_FOREGROUND_CALL_STATE, -2) {
            case PreciseCallState.PRECISE_CALL_STATE_IDLE:
                Log.d(This.LOG_TAG, "IDLE");
                break;
            case PreciseCallState.PRECISE_CALL_STATE_DIALING:
                Log.d(This.LOG_TAG, "DIALING");
                break;
            case PreciseCallState.PRECISE_CALL_STATE_ALERTING:
                Log.d(This.LOG_TAG, "ALERTING");
                break;
            case PreciseCallState.PRECISE_CALL_STATE_ACTIVE:
                Log.d(This.LOG_TAG, "ACTIVE");
                break;
        }
    }
}

PreciseCallState.Java ですべての可能な呼び出し状態を検索できます。インテントに含まれるすべての追加機能は TelephonyRegistry.Java で確認できます。

11
Tim S.

RINGING状態に到達するのは、着信呼び出しだけのようです。発信コールはIDLEからOFFHOOKに変わるため、電話の状態を確認することでこれを実現できない可能性があります。

Androidテレフォニースタックのさまざまなコール状態は何を表していますか?

3
1087427

次の場所で注意を払ってください:

tm.listen(new PhoneStateListener() {
            @Override
            public void onCallStateChanged(int state, String incomingNumber) {
                switch (state) {
                    case TelephonyManager.CALL_STATE_RINGING:
                        Log.d(This.LOG_TAG, "RINGING");
                        break;
                    case TelephonyManager.CALL_STATE_OFFHOOK:
                        Log.d(This.LOG_TAG, "OFFHOOK");
                        break;
                    case TelephonyManager.CALL_STATE_IDLE:
                        Log.d(This.LOG_TAG, "IDLE");
                        break;
                    default:
                        Log.d(This.LOG_TAG, "Default: " + state);
                        break;
                }
            }
        }, PhoneStateListener.LISTEN_CALL_STATE);

「incomingNumber」引数が表示されますか?はい、そのコードは、デバイスに電話がかかってきた場合にのみ、電話の状態を検出できます。

1
nđq

たぶん、CallManagerを使用してみますか?チェックアウト http://grepcode.com/file/repository.grepcode.com/Java/ext/com.google.Android/android/2.3.3_r1/com/Android/internal/telephony/CallManager.Java 。コンピュータ上のSDKファイルの中に、CallManager.Javaも見つかりました。リンクされたページからの次のテキストは有望なようです:

Register for getting notifications for change in the Call State Call.State This is 
called PreciseCallState because the call state is more precise than the Phone.State 
which can be obtained using the Android.telephony.PhoneStateListener Resulting events 
will have an AsyncResult in Message.obj. AsyncResult.userData will be set to the obj 
argument here. The h parameter is held only by a weak reference.

1051
1052    public void registerForPreciseCallStateChanged(Handler h, int what, Object obj){
1053        mPreciseCallStateRegistrants.addUnique(h, what, obj);
1054    }

私は何もコーディングしようとしなかったので、それがあなたが望むことをできるかどうか本当にわかりませんが、知りたいです。

1
hBrent