如何通过单击按钮接听来电?

时间:2010-05-06 09:31:59

标签: android phone-call

我正在尝试实施自己的电话处理用户界面。

我想要做的是,如果有来电,则会显示来电号码和图片,如果按下按钮,则会接听/接听来电。

相关代码是:

 @Override
  public void onCreate(Bundle savedInstanceState) {

    super.onCreate(savedInstanceState);
    setContentView(R.layout.main);
    answerButton = (Button) findViewById(R.id.pickup);
    answerButton.setOnClickListener(new OnClickListener() {
        public void onClick(final View v) {
            Intent intent = new Intent("android.intent.action.ANSWER");
            intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
            startActivity(intent);          
        }
    });

可悲的是,代码不起作用。首先,如果按下我的答案按钮,则会抛出异常:

  

ActivityNotFoundException:找不到处理Intent的活动{
  ACT = android.intent.action.ANSWER

然后我在AndroidManifest.xml中添加了一个条目:

<uses-permission android:name="android.permission.CALL_PHONE" />

我再次运行应用程序,不再有例外。但是,我怀疑来电是不是真的被接受了。因为如果按下Android的屏幕应答按钮(绿色按钮),接听来电并且仿真器屏幕的左上角也会显示绿色通话图标,而我的应用则没有。

我还在android源码中阅读了Phone应用程序的源代码。在Phone类中有诸如acceptCall()之类的方法。但是这些代码对我来说似乎很难使用,因为代码中有许多导入声明,例如:

import com.android.internal.telephony.Call;
import com.android.internal.telephony.CallStateException;
import com.android.internal.telephony.CallerInfo;
import com.android.internal.telephony.CallerInfoAsyncQuery;
import com.android.internal.telephony.Connection;
import com.android.internal.telephony.MmiCode;
import com.android.internal.telephony.Phone;

而且,如果我在代码中添加这些导入,则会出现太多错误,例如:
The import com.android.internal.telephony cannot be resolved

解决问题的正确方法是什么?

5 个答案:

答案 0 :(得分:1)

添加“android.intent.category.DEFAULT”类别(Intent.CATEGORY_DEFAULT

答案 1 :(得分:1)

意图android.intent.action.ANSWER在某种程度上无法按预期工作。通过模拟蓝牙按钮来接听来电,有一种解决方法。您可以在auto-answer项目中看到一个示例。

答案 2 :(得分:0)

您需要创建一个广播接收器,您可以在手机响铃时获取该事件,之后您可以启动所需的活动。在使用CUSTOM ROM之前,您无法更换默认的来电屏幕。 并且不要忘记在清单文件中设置广播接收器的优先级。 获得活动后,您可以使用反射来使用ITelephony的对象。这可以为您提供回答或拒绝来电的方法。

答案 3 :(得分:0)

这可以使用com.android.internal.telephony包,但你必须在eclipse中找到使用这个方法的东西,你的应用程序必须使用android源代码编译为系统应用程序。

答案 4 :(得分:0)

通过以下方式更改您的接受电话方法:

public static void acceptCall(Context context) 
{
    Intent buttonUp = new Intent(Intent.ACTION_MEDIA_BUTTON);
    buttonUp.putExtra(Intent.EXTRA_KEY_EVENT, 
      new KeyEvent(KeyEvent.ACTION_UP, KeyEvent.KEYCODE_HEADSETHOOK));
    context.sendOrderedBroadcast(buttonUp, "android.permission.CALL_PRIVILEGED");
}