android接听来电

时间:2013-10-31 15:12:26

标签: java android telephony

我拦截了来电并在标准屏幕上显示我的活动。 在这个活动中,我有按钮“接听电话”和“拒绝电话”,但我不能这样做。

我找到了两种解决方案来接听/拒绝电话号码:

  1. 使用ITelephony.aidl但它只能在api v10之前运行。所以这是错误的方式
  2. 有以下内容:

    private void acceptCall(Context context) {
      Intent buttonDown = new Intent(Intent.ACTION_MEDIA_BUTTON);
      buttonDown.putExtra(Intent.EXTRA_KEY_EVENT, new KeyEvent(
            KeyEvent.ACTION_UP, KeyEvent.KEYCODE_HEADSETHOOK));
      context.sendOrderedBroadcast(buttonDown,
            "android.permission.CALL_PRIVILEGED");
        // froyo and beyond trigger on buttonUp instead of buttonDown
      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");
    }
    
    
    private void acceptCall(Context context) {
      Intent buttonDown = new Intent(Intent.ACTION_MEDIA_BUTTON);
      buttonDown.putExtra(Intent.EXTRA_KEY_EVENT, new KeyEvent(
            KeyEvent.ACTION_DOWN, KeyEvent.KEYCODE_HEADSETHOOK));
      context.sendOrderedBroadcast(buttonDown,
            "android.permission.CALL_PRIVILEGED");
      // froyo and beyond trigger on buttonUp instead of buttonDown
      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");
    }
    
  3. 从这里http://www.codeproject.com/Tips/578817/Reject-and-Accept-an-Incoming-Call

    然而没什么!我点击按钮并相应地调用上面的方法,没有任何反应。 我在几台设备上进行了测试,结果相同。

    嗯,然后我成功地回答了三星nexus one,但没有感觉HTC。拒绝功能对两者都不起作用。

4 个答案:

答案 0 :(得分:2)

结果我找到了http://androidbridge.blogspot.com/2011/05/how-to-answer-incoming-call-in-android.html

这是适用于HTC设备的解决方案:

  

在Android 2.3.3 HTC Sensation中,这段代码不起作用。原因是在2.3.3我发现HeadsetObserver正在侦听实际的蓝牙插件事件。因此,您需要发送一个Intent假装已经连接了耳机。要解决此问题,您需要在调用上述代码之前发送ACTION_HEADSET_PLUG Intent。

所以我在接受呼叫代码之前添加了以下代码:

Intent headSetUnPluggedintent = new Intent(Intent.ACTION_HEADSET_PLUG);
 headSetUnPluggedintent.addFlags(Intent.FLAG_RECEIVER_REGISTERED_ONLY);
 headSetUnPluggedintent.putExtra("state", 1); // 0 = unplugged  1 = Headset with microphone 2 = Headset without microphone
 headSetUnPluggedintent.putExtra("name", "Headset");
 // TODO: Should we require a permission?
 sendOrderedBroadcast(headSetUnPluggedintent, null);

所以最终工作代码是

    private void acceptCall() {
    setHeadSetConnectEmulated();
    Intent buttonUP = new Intent(Intent.ACTION_MEDIA_BUTTON);
    buttonUP.putExtra(Intent.EXTRA_KEY_EVENT, new KeyEvent(KeyEvent.ACTION_UP, KeyEvent.KEYCODE_HEADSETHOOK));
    IncomingCallActivity.this.getApplicationContext().sendOrderedBroadcast(buttonUP, "android.permission.CALL_PRIVILEGED");
}

private void setHeadSetConnectEmulated(){
    Intent headSetUnPluggedintent = new Intent(Intent.ACTION_HEADSET_PLUG);
    headSetUnPluggedintent.addFlags(Intent.FLAG_RECEIVER_REGISTERED_ONLY);
    headSetUnPluggedintent.putExtra("state", 1); // 0 = unplugged  1 = Headset with microphone 2 = Headset without microphone
    headSetUnPluggedintent.putExtra("name", "Headset");
    // TODO: Should we require a permission?
    sendOrderedBroadcast(headSetUnPluggedintent, null);
}

private void rejectCall() {
    Intent buttonDown = new Intent(Intent.ACTION_MEDIA_BUTTON);
    buttonDown.putExtra(Intent.EXTRA_KEY_EVENT, new KeyEvent(KeyEvent.ACTION_DOWN, KeyEvent.KEYCODE_HEADSETHOOK));
    IncomingCallActivity.this.getApplicationContext().sendOrderedBroadcast(buttonDown, "android.permission.CALL_PRIVILEGED");
}

答案 1 :(得分:1)

我遇到了同样的问题。按钮向上/向下意图的目的是模仿耳机应答。如果没有插入耳机,某些手机和Android版本将忽略意图。您需要先检查耳机状态(这样才可以重置词语)并发送意图“插入”耳机。

答案 2 :(得分:0)

我有一个类似的问题,除了我试图通过我创建的应用程序拨打电话。通过将其添加到清单中来解决问题。

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

答案 3 :(得分:0)

您可以使用此接收器来接听或拒绝,

public class AutoAnswerIntentService extends BroadcastReceiver {

Context context = null;
private static String mFileName = null;

private static final String TAG = "in reciver";

@Override
public void onReceive(Context context, Intent intent) {
    // Toast.makeText(context, "calling now", Toast.LENGTH_LONG).show();
    if (!intent.getAction().equals("android.intent.action.PHONE_STATE"))
        return;
    else {
        String state = intent.getStringExtra(TelephonyManager.EXTRA_STATE);

        if (state.equals(TelephonyManager.EXTRA_STATE_RINGING)) {
                    if (state.equals(TelephonyManager.EXTRA_STATE_RINGING)) {
        String number = intent
                .getStringExtra(TelephonyManager.EXTRA_INCOMING_NUMBER);
        Log.d(TAG, "Incoming call from: " + number);
        Intent buttonUp = new Intent(Intent.ACTION_MEDIA_BUTTON);
        buttonUp.putExtra(Intent.EXTRA_KEY_EVENT, new KeyEvent(
                KeyEvent.ACTION_UP, KeyEvent.KEYCODE_HEADSETHOOK));
        try {
            context.sendOrderedBroadcast(buttonUp,
                    "android.permission.CALL_PRIVILEGED");
            Log.d(TAG, "ACTION_MEDIA_BUTTON broadcasted...");
            // startRecording();
        } catch (Exception e) {
            Log.d(TAG, "Catch block of ACTION_MEDIA_BUTTON broadcast !");


            return;
        } else if (state.equals(TelephonyManager.EXTRA_STATE_OFFHOOK)) {

            Log.d(TAG, "CALL ANSWERED NOW !!");
            return;
        } else if (state.equals(TelephonyManager.EXTRA_STATE_IDLE)) {
            Log.d(TAG, "ALL DONE IN ELSE IF...... !!");

        } else {
            Log.d(TAG, "ALL DONE IN ELSE ...... !!");

        }
    }
}

} 并在清单文件中添加此权限

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