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 usingtelecomManager.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
Android: Execute Code in Regular Intervals
How to Use a Library Project in Android Studio
Custom Filtering Arrayadapter in Listview
Camera Preview Stretched on Few Android Devices
Is Discard Bad for Program Performance in Opengl
How to Look-Up a Contact's Name from Their Phone Number on Android
Selecting Contact from Autocomplete Textview
Android Send a Image and Save Url
Can't Create New Kotlin Project After Updating to Android Studio 4.2
How to Create a Persistent Alarmmanager
Just Upgraded My Os X to Yosemite, Android Device Chooser Not Showing Device - What to Do
Is There a Maximum Size to Android Internal Storage Allocated for an App
Getting Gradle Error "Could Not Reserve Enough Space for Object Heap" Constantly in Intellij Idea