How do you programmatically end a call on 2.3+?

前端 未结 3 722
生来不讨喜
生来不讨喜 2020-12-24 04:04

Up to Android 2.2 I know I can use reflection and terminate the call through getITelephony.

However, as of 2.3 this no longer works because even if you grant the MO

相关标签:
3条回答
  • 2020-12-24 04:10

    Well after much soul-searching I realize something really, really, really dumb. On the plus side no one on StackOverflow seems to have noticed it either. MODIFY_PHONE_STATE is no longer working on silenceRinger() since 2.3+, but endCall is just fine.

    So the solution is to comment out the call to silenceRinger().

    Can't believe I've just spent a week on this! I'll try to update the other questions as there seem to be tons of dupe on SO along the lines of 'it's not possible to use reflection to terminate the calls anymore'.

    0 讨论(0)
  • 2020-12-24 04:19

    The call() , endcall() functions work fine for me as well. But there is also another way tha works without using iTelephony.aidl. Its published in this post. BTW I think google already knows but for some reason they havent done anything with the rest of functions, wich is good!!!

    http://androidbridge.blogspot.com/2011/05/how-to-answer-incoming-call-in-android.html

    0 讨论(0)
  • 2020-12-24 04:30

    private void endCall(final String cutofftime) {

    TelephonyManager telephony = (TelephonyManager) srvs
                .getSystemService(Context.TELEPHONY_SERVICE);
        Class c;
        final com.android.internal.telephony.ITelephony telephonyService;
        try {
            c = Class.forName("android.telephony.TelephonyManager");//telephony.getClass().getName());
            Log.i("TelephonyClass Name", telephony.getClass().getName());
            Method m = c.getDeclaredMethod("getITelephony");
            m.setAccessible(true);
            telephonyService = (ITelephony) m.invoke(telephony);
            TimerTask task = new TimerTask() {
    
                @Override
                public void run() {
                    try {
                        if (telephonyService.isIdle()
                                || telephonyService.isOffhook()
                                || telephonyService.isRinging())
                            telephonyService.endCall();
                    } catch (RemoteException e) {
                        // TODO Auto-generated catch block
                        e.printStackTrace();
                    }
                }
            };
            long delay = Integer.parseInt(cutofftime) * 1000;
            new Timer().schedule(task, delay);
        } catch (ClassNotFoundException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        } catch (SecurityException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        } catch (NoSuchMethodException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        } catch (IllegalArgumentException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        } catch (IllegalAccessException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        } catch (InvocationTargetException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
    
    }
    
    0 讨论(0)
提交回复
热议问题