Rejecting Incoming Call in Android

How to Answer or reject incoming calls programmatically in Android 9+?

Unfortunately, the answer is no. From Android 10 onwards the only way to handle phone calls is by using the InCallService APIs. I have made a basic dialer app in java that explains basics of how to handle calls as a default dialer app (link: https://github.com/adnan-creator/java-custom-dialer). So for now the best solution is to be the default dialer app till you need the functionality of programmatically accepting or rejecting calls. Then you can transfer the controls back to the inbuilt dialer app.

This can be done by initially storing the package name of the inbuilt dialer before taking control using
telecomManager.getDefaultDialerPackage().

The control can then be passed back to the inbuilt dialer app

Intent intent = (new Intent(TelecomManager.ACTION_CHANGE_DEFAULT_DIALER))
.putExtra(
TelecomManager.EXTRA_CHANGE_DEFAULT_DIALER_PACKAGE_NAME,
storedPackageName);
this.startActivityForResult(intent, REQUEST_CODE_SET_DEFAULT_DIALER);

How to Reject a call programatically in android

First create this Interface:

  public interface ITelephony {

boolean endCall();

void answerRingingCall();

void silenceRinger();

}

Then Create this class that extends BroadcastReceiver

public class IncomingCallReceiver extends BroadcastReceiver {
private ITelephony telephonyService;
private String blacklistednumber = "+458664455";

@Override
public void onReceive(Context context, Intent intent) {

TelephonyManager tm = (TelephonyManager) context.getSystemService(Context.TELEPHONY_SERVICE);
try {
Class c = Class.forName(tm.getClass().getName());
Method m = c.getDeclaredMethod("getITelephony");
m.setAccessible(true);
ITelephony telephonyService = (ITelephony) m.invoke(tm);
Bundle bundle = intent.getExtras();
String phoneNumber = bundle.getString("incoming_number");
Log.e("INCOMING", phoneNumber);
if ((phoneNumber != null) && phoneNumber.equals(blacklistednumber)) {
telephonyService.silenceRinger();
telephonyService.endCall();
Log.e("HANG UP", phoneNumber);
}

} catch (Exception e) {
e.printStackTrace();
}
}

This will only block that single phonenumber, but you get the point.

In your manifest add this:

<receiver android:name=".IncomingCallReceiver">
<intent-filter android:priority="999">
<action android:name="android.intent.action.PHONE_STATE" />
</intent-filter>
</receiver>
<uses-permission android:name="android.permission.READ_PHONE_STATE" />
<uses-permission android:name="android.permission.MODIFY_PHONE_STATE" />
<uses-permission android:name="android.permission.CALL_PHONE" />
<uses-permission android:name="android.permission.PROCESS_INCOMING_CALLS" />

Android reject incoming call

I found the answer myself. For others interested, here here it is:

create aidl folder in main folder.

create package com.android.internal.telephony in aidl folder

create a aidl file in package:

interface ITelephony {      

boolean endCall();
void answerRingingCall();

}

for the code about end call see the answer in the link.

and it's not necessary add the permission

android.permission.MODIFY_PHONE_STATE



Related Topics



Leave a reply



Submit