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

时间:2014-04-02 00:47:41

标签: calendar sms android-studio

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

" How to detect incoming calls, in an Android device?"

" Incoming call broadcast receiver not working (Android 4.1)"

" How to detect incoming call with the help of Broadcast Receiver?"

" Custom incoming/outgoing call screen in Android"

" how to make an incoming call from our application"

" Android: Taking complete control of phone(kiosk mode), is it possible? How?"

" How to disconnect incoming call in android by programatically"

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

目前答案是: " How to detect incoming calls, in an Android device?"似乎更好,因为它似乎以优雅的方式处理来电 - 但答案并没有谈到如何(a)使铃声静音,(b)结束呼叫/转移它等 - 示例解释了如何确定在任何给定时间手机处于什么状态。另一个缺点似乎是我正在努力取消注册监听器功能,这意味着即使在示例应用程序终止之后,监听器仍然似乎保持活动状态并且在有呼叫时跳转到操作。唯一能阻止这种情况的方法似乎是重启手机 - 这非常烦人。

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

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

1 个答案:

答案 0 :(得分:1)

仍然可以使振铃器静音并停止来电/拨出电话。

首先,“How to detect incoming calls, in an Android device?”中的示例是检测来电的正确方法。

现在,为了使铃声消失并停止通话:

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

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

并将此代码添加到界面:

public interface ITelephony
{
    boolean endCall();
    void answerRingingCall();
    void silenceRinger();
}

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

//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();

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

<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" />

我已在许多设备上测试过此代码,如果您有任何问题,可以随时问我:)