【问题标题】:How to accept an incoming call by clicking a button?如何通过单击按钮接听来电?
【发布时间】:2017-08-24 21:04:15
【问题描述】:

我正在尝试实现自己的电话处理 UI。

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

相关代码为:

 @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 的 Activity {
act=android.intent.action.ANSWER

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

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

我再次运行应用程序,不再有异常。但是,我怀疑来电并没有真正被接受。因为如果按下安卓的屏幕接听按钮(绿色按钮),来电被接受,并且模拟器屏幕的左上角也会显示一个绿色的通话中图标,而我的应用程序没有。

我还阅读了 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

解决我的问题的正确和简单的方法是什么?

【问题讨论】:

标签: android phone-call


【解决方案1】:

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

【讨论】:

  • 谢谢你,MasterGaurav!但我已经在清单文件中添加了类别“android.intent.category.DEFAULT”。这是代码: 所以不知道还有其他原因。
【解决方案2】:

意图android.intent.action.ANSWER 不知何故无法按预期工作。有一种解决方法是模拟蓝牙按钮来接听来电。您可以从auto-answer 项目中看到一个示例。

【讨论】:

    【解决方案3】:

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

    【讨论】:

      【解决方案4】:

      使用com.android.internal.telephony 包可以做到这一点,但是您必须找到在 eclipse 中使用此方法的方法,并且您的应用必须使用 android 源代码编译为系统应用。

      【讨论】:

        【解决方案5】:

        通过以下方式更改您的接受呼叫方法:

        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");
        } 
        

        【讨论】:

          猜你喜欢
          • 2018-06-28
          • 2015-01-18
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2011-11-14
          • 2018-07-22
          • 2019-12-03
          • 1970-01-01
          相关资源
          最近更新 更多