android - 接听电话

标签 android telephonymanager

我需要自动接听电话(取决于源电话号码)。这个时候我可以挂断来电,但是不能接听。

我已经找到了几个例子,这就是我现在所拥有的。

添加到 AndroidManifest:

 <permission android:name="android.permission.MODIFY_PHONE_STATE" />
 <uses-permission android:name="android.permission.MODIFY_PHONE_STATE" />
 <uses-permission android:name="android.permission.CALL_PHONE" />
 ...
 <receiver android:name=".panic.IncomingCallReceiver">
        <intent-filter android:priority="100">
            <action android:name="android.intent.action.PHONE_STATE" />
            <action android:name="android.intent.action.NEW_OUTGOING_CALL" />
        </intent-filter>
    </receiver>

这是我的代码:

public class IncomingCallReceiver extends BroadcastReceiver {
    @Override
    public void onReceive(Context context, Intent intent) {
        TelephonyManager telephony = (TelephonyManager) context.getSystemService(Context.TELEPHONY_SERVICE);
        MyPhoneStateListener listener = new MyPhoneStateListener(context);
        telephony.listen(listener, PhoneStateListener.LISTEN_CALL_STATE);
    }

    public class MyPhoneStateListener extends PhoneStateListener {
        Context context;

        public MyPhoneStateListener(Context context) {
            super();
            this.context = context;
        }

        @Override
        public void onCallStateChanged(int state, String callingNumber) {
            super.onCallStateChanged(state, callingNumber);
            switch (state) {
                case TelephonyManager.CALL_STATE_IDLE:
                    break;

                case TelephonyManager.CALL_STATE_OFFHOOK:
                    //handle out going call
                    acceptCallIfBlocked(callingNumber);
                    break;

                case TelephonyManager.CALL_STATE_RINGING:
                    //handle in coming call
                    acceptCallIfBlocked(callingNumber);
                    break;

                default:
                    break;
            }
        }

        private void acceptCallIfBlocked(String callingNumber) {
            if (shouldAcceptCall()) {
                TelephonyManager tm = (TelephonyManager) context.getSystemService(Context.TELEPHONY_SERVICE);
                try {
                    // Java reflection to gain access to TelephonyManager's
                    // ITelephony getter
                    Class c = Class.forName(tm.getClass().getName());
                    Method m = c.getDeclaredMethod("getITelephony");
                    m.setAccessible(true);
                    final Object invoke = m.invoke(tm);
                    c = Class.forName(invoke.getClass().getName());
                    m = c.getDeclaredMethod("endCall");
//            m = c.getDeclaredMethod("answerRingingCall"); //  NOT WORKING
                    m.setAccessible(true); // Make it accessible
                    final Object invoke1 = m.invoke(invoke);
                } catch (Throwable ignored) {
                }
            }
        }
    }
}

我可以使用此代码成功结束通话,但我需要执行 answerRingingCall 才能完成我需要的操作。

我遇到了这个异常:

Neither user 10056 nor current process has android.permission.MODIFY_PHONE_STATE

我在 Lollipop 上运行,但需要在尽可能多的设备上执行。 有帮助吗?

最佳答案

拦截调用仅适用于 2.2 - 4.0。 Google has blocked the MODIFY_PHONE_STATE permission for anyone except for phone manufacturer certificates

作为一项安全功能,Google 已限制拦截调用。简而言之,您不能故意这样做。

您可以在 Android developer documentation 中看到它:

public static final String MODIFY_PHONE_STATE

Added in API level 1
Allows modification of the telephony state - power on, mmi, etc. Does not include placing calls.

Not for use by third-party applications.

Constant Value: "android.permission.MODIFY_PHONE_STATE"

请注意短语不供第三方应用程序使用。

关于android - 接听电话,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28550390/

相关文章:

java - 如何在安卓上使用文件锁?

Android TelephonyManager 不适用于 android studio 模拟器?

android - 在 android PIE 9 中结束通话后来电号码为空

android - 如果已经在通话并且第二个调用者正在调用,如何不触发 PhoneStateListener.CALL_STATE_RINGING

安卓信号强度

java - 用于 Android 中网络通信的最佳包.. Java/Apache?

android - Android项目的选项卡+滑动应用程序中不同选项卡的不同菜单

服务中的 Android 蓝牙

java - 如何从 jsonobject 获取值 "10th"到 java?

android - CallScreeningService - 几秒钟后断开调用 - Android 10