如何在我的日历有忙事件时以编程方式将传入呼叫重定向到语音邮件

VLB*_*oor 8 sms calendar android-studio

作为Android开发的新手,我一直在研究StackOverflow以回答这个问题:当我应该参加我的日历所示的会议时,如何将所有传入消息和电话的电话铃声静音.我能够访问日历并能够检查当前时间是否在事件设置的时间内.但是如何将任何来电发送到语音邮件(并向呼叫者发送短信).我在这里经历了很多问题:

" 如何在Android设备中检测来电? "

" 来电广播接收器无法正常工作(Android 4.1) "

" 如何在广播接收器的帮助下检测来电? "

" 在Android中自定义传入/传出呼叫屏幕 "

" 如何从我们的应用程序拨打来电 "

" Android:完全掌控手机(自助终端模式),有可能吗?怎么样? "

" 如何以编程方式断开android中的来电 "

使用AIDL的ITelephony看起来很有希望,直到我发现由于安全问题它不再适用于Android 4.2等.

目前答案是:" 如何在Android设备中检测来电? "似乎更好,因为它似乎以优雅的方式处理来电 - 但答案并没有谈到如何(a)沉默振铃,(b)结束通话/转移等 - 该示例解释了如何确定手机在任何给定时间的状态.另一个缺点似乎是我正在努力取消注册监听器功能,这意味着即使在示例应用程序终止之后,监听器仍然似乎保持活动状态并且在有呼叫时跳转到操作.只有停止这种方式似乎是重启手机 - 这非常烦人.

另一个方面是,这些问题中的大多数都是一年或更长时间,一些旧答案不再有效 - 正如我之前提到的 - ITelephony看起来很有前景,但不再适用于新手机.

Google文档似乎建议程序可以通过发送Intent等以编程方式在SMS文本消息中包含来电的答案 - 但在任何地方都没有示例,看起来Google的文档可能已过时(或者我正在阅读互联网上的旧版本 - 虽然我不知道它是如何可能的,因为我使用谷歌搜索来找到答案.)

小智 1

仍然可以使铃声静音并停止来电/去电。

首先,“如何在 Android 设备中检测来电? ”中的示例是检测来电的正确方法。

现在,要使铃声静音并停止通话:

首先,在“com.android.internal.telephony”包下创建一个名为“ITelephony”的接口:

https://i.stack.imgur.com/UQoVc.png

并将此代码添加到界面中:

public interface ITelephony
{
    boolean endCall();
    void answerRingingCall();
    void silenceRinger();
}
Run Code Online (Sandbox Code Playgroud)

然后,在您想要使铃声静音并停止呼叫的方法上,添加以下代码:

//TelephonyManager
TelephonyManager telephonyManager = (TelephonyManager)context.getSystemService(Context.TELEPHONY_SERVICE);

// Get the getITelephony() method
Class c = Class.forName(telephonyManager.getClass().getName());
                        Method m = c.getDeclaredMethod("getITelephony");

// Disable access check
m.setAccessible(true);

// Invoke getITelephony() to get the ITelephony interface
ITelephony telephonyInterface = (ITelephony) m.invoke(telephonyManager);

//Invoke silenceRinger
telephonyInterface.silenceRinger();

// Invoke endCall()
telephonyInterface.endCall();
Run Code Online (Sandbox Code Playgroud)

最后,在清单中,您需要添加以下权限:

<uses-permission android:name="android.permission.PROCESS_OUTGOING_CALLS" />
<uses-permission android:name="android.permission.CALL_PHONE" />
<uses-permission android:name="android.permission.MODIFY_PHONE_STATE" tools:ignore="ProtectedPermissions" />
Run Code Online (Sandbox Code Playgroud)

我已经在许多设备上测试了此代码并且它有效,如果您有任何问题,请随时问我:)