In my application, it would be nice to intercept when the user rejects a call, i.e. choose to send busy tone. Is there any way, besides being notified when there is an inco
Hey.
You could use the PhoneStateListener
and CallLog
classes to query the recent calls list to find rejected calls.
http://developer.android.com/reference/android/provider/CallLog.html http://developer.android.com/reference/android/telephony/PhoneStateListener.html
Alternatively you can monitor broadcasts on android.intent.action.NEW_OUTGOING_CALL
and android.intent.action.NEW_INCOMING_CALL
just put android.permission.PROCESS_INCOMING_CALLS
and android.permission.PROCESS_OUTGOING_CALLS
in your manifest.
After a long time, Search and logic to solve this problem, I get the solution:
Problem: If i call a person, if my call is not accepted by the person,in my side i have to show a Toast is my call is rejected
Solution : Create a receiver which is register by two action
android.intent.action.NEW_OUTGOING_CALL android.intent.action.PHONE_STATE
Both action are necessary.
For this you have to take given permission
<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>
And your BroadcastReceiver class
*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;
}
}
}
}
This will show you a Toast when you call is not accepting.
what if use android.intent.action.NEW_INCOMING_CALL
?
When you reject incoming call, callstate
changes from ringing to idle. This means you rejected.
If call state changes from OFFHOOK
to idle it means you answered a call.