私のアプリケーションでは、ユーザーが通話を拒否したとき、つまりビジー トーンの送信を選択したときにインターセプトできれば便利です。着信があるときに通知される以外に、これを行う方法はありますか? これに関するドキュメントには何も見つかりませんでした。この情報はコール ログに保存されますか? つまり、コール ログをポーリングして、コールが拒否されたか応答されたかを確認できますか?
3 に答える
おい。PhoneStateListener
およびクラスを使用CallLog
して最近の通話リストをクエリし、拒否された通話を見つけることができます。
http://developer.android.com/reference/android/provider/CallLog.html http://developer.android.com/reference/android/telephony/PhoneStateListener.html
または、ブロードキャストを監視android.intent.action.NEW_OUTGOING_CALL
して、マニフェストandroid.intent.action.NEW_INCOMING_CALL
に配置することもできます。android.permission.PROCESS_INCOMING_CALLS
android.permission.PROCESS_OUTGOING_CALLS
長い間、この問題を解決するための検索とロジックの後、解決策が得られました。
問題:人に電話をかけた場合、その人が電話を受け付けない場合、私の側では、電話が拒否されたことを示すトーストを表示する必要があります
解決策 : 2 つのアクションで登録されるレシーバーを作成します。
android.intent.action.NEW_OUTGOING_CALL android.intent.action.PHONE_STATE
両方のアクションが必要です。
このためには、与えられた許可を取る必要があります
<uses-permission android:name="android.permission.READ_PHONE_STATE"/>
<uses-permission android:name="android.permission.CALL_PHONE"/>
<uses-permission android:name="android.permission.READ_PHONE_STATE"/>
<uses-permission android:name="android.permission.PROCESS_OUTGOING_CALLS"/>
Manifast.xml
<receiver android:name="Call_Receiver">
<intent-filter>
<action android:name="android.intent.action.NEW_OUTGOING_CALL"/>
<action android:name="android.intent.action.PHONE_STATE"/>
</intent-filter>
</receiver>
そしてあなたの BroadcastReceiver クラス
*Call_Receiver.java*
import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import android.telephony.PhoneStateListener;
import android.telephony.TelephonyManager;
import android.util.Log;
import android.widget.Toast;
/**
*
*/
public class Call_Receiver extends BroadcastReceiver {
private Context ctx;
@Override
public void onReceive(Context context, Intent intent) {
ctx = context;
OutgoingIncomingCallListener phoneListener = new OutgoingIncomingCallListener();
TelephonyManager telephony = (TelephonyManager) context
.getSystemService(Context.TELEPHONY_SERVICE);
if (intent.getAction()
.equals("android.intent.action.NEW_OUTGOING_CALL")) {
Log.i("", " :::::::::::: inside onReceive if &&&&&& :::::::::::::");
telephony.listen(phoneListener,
PhoneStateListener.LISTEN_CALL_STATE);
}
}
class OutgoingIncomingCallListener extends PhoneStateListener {
public boolean wasRinging;
@Override
public void onCallStateChanged(int state, String incomingNumber) {
switch (state) {
case TelephonyManager.CALL_STATE_RINGING:
Log.i("", " ************ RINGING ********");
wasRinging = true;
break;
case TelephonyManager.CALL_STATE_OFFHOOK:
Log.i("", " *********** OFFHOOK ********");
if (!wasRinging) {
// Start your new activity
Log.i("", " *********** if ********");
} else {
// Cancel your old activity
Log.i("", " *********** else ********");
}
// this should be the last piece of code before the break
wasRinging = true;
break;
case TelephonyManager.CALL_STATE_IDLE:
Log.i("", " ::::::::::: IDLE :::::::::");
// this should be the last piece of code before the break
// Log.i("", " *********** OFFHOOK ********");
if (wasRinging) {
Toast.makeText(ctx,
"Your call is disconnected by receiver", 10000)
.show();
}
wasRinging = true;
break;
}
}
}
}
これにより、通話が受け付けられないときにトーストが表示されます。
使用するとどうなりますandroid.intent.action.NEW_INCOMING_CALL
か?
着信を拒否すると、callstate
呼び出し中からアイドル状態に変わります。これはあなたが拒否したことを意味します。
通話状態がアイドル状態に変化した場合OFFHOOK
、通話に応答したことを意味します。