This is a familiar question in SO. and what I need is to
end call programmatically.
I have searched a lot...
http://androidsourcecode.blogspot.in/2010/10/blocking-incoming-call-android.html
http://androiddesk.wordpress.com/2012/08/02/blocking-a-call-without-user-intervention-in-android/
Rejecting Incoming call in android
How to programmatically answer/end a call in Android 4.1?
http://www.emoticode.net/android-sdk/block-incoming-and-outgoing-phone-calls-programmatically.html
How to block calls in android
how to block a mobile number call and message receiving in android application development?
and http://androidsourcecode.blogspot.in/2010/10/blocking-incoming-call-android.html
and lot more questions, answers and suggestions...
All are saying use ITelephonyService.aidl
in combination with TelephonyManager
and the solution is working perfect on many devices but it's not working on Samsung S Duos. I am struggling over a week but didn't get a solution..
is there any special API to work with on this type of devices? How can I reject incoming call? please help me...
Try this Sure it will work. It's working fine for me.
You could download the ITelephony.java file from ITelephony.java
After that you add the method to end call:
Function to Disconnect call
public void disconnectCall(){
try {
String serviceManagerName = "android.os.ServiceManager";
String serviceManagerNativeName = "android.os.ServiceManagerNative";
String telephonyName = "com.android.internal.telephony.ITelephony";
Class<?> telephonyClass;
Class<?> telephonyStubClass;
Class<?> serviceManagerClass;
Class<?> serviceManagerNativeClass;
Method telephonyEndCall;
Object telephonyObject;
Object serviceManagerObject;
telephonyClass = Class.forName(telephonyName);
telephonyStubClass = telephonyClass.getClasses()[0];
serviceManagerClass = Class.forName(serviceManagerName);
serviceManagerNativeClass = Class.forName(serviceManagerNativeName);
Method getService = // getDefaults[29];
serviceManagerClass.getMethod("getService", String.class);
Method tempInterfaceMethod = serviceManagerNativeClass.getMethod("asInterface", IBinder.class);
Binder tmpBinder = new Binder();
tmpBinder.attachInterface(null, "fake");
serviceManagerObject = tempInterfaceMethod.invoke(null, tmpBinder);
IBinder retbinder = (IBinder) getService.invoke(serviceManagerObject, "phone");
Method serviceMethod = telephonyStubClass.getMethod("asInterface", IBinder.class);
telephonyObject = serviceMethod.invoke(null, retbinder);
telephonyEndCall = telephonyClass.getMethod("endCall");
telephonyEndCall.invoke(telephonyObject);
} catch (Exception e) {
e.printStackTrace();
Log.error(DialerActivity.this,
"FATAL ERROR: could not connect to telephony subsystem");
Log.error(DialerActivity.this, "Exception object: " + e);
}
}
Try this function:
private void endCall() {
Context context = getApplicationContext();
try {
TelephonyManager telephony = (TelephonyManager) context.getSystemService(Context.TELEPHONY_SERVICE);
Class<?> c = Class.forName(telephony.getClass().getName());
Method m = c.getDeclaredMethod("getITelephony");
m.setAccessible(true);
ITelephony telephonyService = (ITelephony) m.invoke(telephony);
// Funciona en 2.2
// Funciona en 2.3.3
telephonyService.endCall();
logManager.debug("ITelepony was used (endCall)");
} catch (Exception e) {
logManager.error("Error ending call: " + e.getMessage());
logManager.debug("Error ending call", e);
}
}
In your Application create a package (com.android.internal.telephony) in java folder. And then copy ITelephone interface in that package
ITelephone interface source:
http://grepcode.com/file_/repository.grepcode.com/java/ext/com.google.android/android/2.1_r2/com/android/internal/telephony/ITelephony.java/?v=source
Code for Disconnect Call:
Context context = getApplicationContext();
try {
TelephonyManager telephony = (TelephonyManager) context.getSystemService(Context.TELEPHONY_SERVICE);
Class<?> c = Class.forName(telephony.getClass().getName());
Method m = c.getDeclaredMethod("getITelephony");
m.setAccessible(true);
ITelephony telephonyService = (ITelephony) m.invoke(telephony);
telephonyService.answerRingingCall();
} catch (Exception e) {
}
Also add permissions for using this methods:
<uses-permission android:name="android.permission.READ_PHONE_STATE" />
<uses-permission android:name="android.permission.CALL_PHONE" />
<uses-permission android:name="android.permission.PROCESS_INCOMING_CALLS" />