如何以编程方式挂断Oreo及以上版本的电话?

时间:2019-05-19 10:11:22

标签: java android permissions

我正在构建一个应用程序,为用户激活服务后阻止所有来电提供一种方法。

在针对较新的SDK版本(在我的情况下为Oreo及更高版本)中,显然没有解决问题的方法。我最接近解决方案的地方是this thread,但该问题没有公认的答案,在我的情况下也无法提供任何答案。

以下是我也访问过的一些链接:

我的方法是使用前台服务并收听电话状态更改。

@Override
public void onCreate() {
    super.onCreate();
    TelephonyManager telephonyManager = (TelephonyManager) getApplicationContext().getSystemService(Context.TELEPHONY_SERVICE);
    telephonyManager.listen(new CallStateListener(), PhoneStateListener.LISTEN_CALL_STATE);
    Log.d(TAG, "Called onCreate() method");
}

这是CallStateListener

private class CallStateListener extends PhoneStateListener {
    @Override
    public void onCallStateChanged(int state, String phoneNumber) {
        if (state == TelephonyManager.CALL_STATE_RINGING) {
            Log.d(TAG, "Phone is ringing");
            TelephonyManager telephonyManager = (TelephonyManager) getApplicationContext().getSystemService(Context.TELEPHONY_SERVICE);
            try {
                //Gain access to ITelephony getter
                Class c = Class.forName(telephonyManager.getClass().getName());
                Method method = c.getDeclaredMethod("getITelephony");
                method.setAccessible(true);
                com.android.internal.telephony.ITelephony telephony = (ITelephony) method.invoke(telephonyManager);

                //Hung up the call
                telephony.endCall();
            } catch (Exception e) {
                Log.d(TAG, "Exception occurred: " + e.getMessage());
                e.printStackTrace();
            }
        }
    }
}

我可以确认已收到日志消息Phone is ringing

我获得的异常是Exception occurred: MODIFY_PHONE_STATE permission required.

权限MODIFY_PHONE_STATE对第三方应用程序开发人员不可用。我已经看到了修改短绒棉的建议,但我仍然无法请求此权限,因此异常仍然存在。

在这些SDK版本中是否有挂断电话的替代方法?如果是这样,我很乐意被任命为正确的方向。谢谢。

0 个答案:

没有答案