発信呼び出しが応答されたことを検出するために、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()
が呼び出されるたびに、新しいPhoneStateListener
をTelephonyManager
にアタッチしないようにします。
_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で発信通話が応答されたことを確実に検出するにはどうすればよいですか、それは可能ですか?
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 で確認できます。
RINGING状態に到達するのは、着信呼び出しだけのようです。発信コールはIDLEからOFFHOOKに変わるため、電話の状態を確認することでこれを実現できない可能性があります。
次の場所で注意を払ってください:
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」引数が表示されますか?はい、そのコードは、デバイスに電話がかかってきた場合にのみ、電話の状態を検出できます。
たぶん、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 }
私は何もコーディングしようとしなかったので、それがあなたが望むことをできるかどうか本当にわかりませんが、知りたいです。