如何以编程方式回答Android 4.0.3中的呼叫?

时间:2012-10-09 18:03:58

标签: android broadcastreceiver adb runtime.exec

因此,主题说明我需要能够在HTC OneX的Android 4.0.3中以编程方式接听电话。我已经阅读过几个地方,MODIFY_PHONE_STATE权限已被Google撤销,因此要执行此任务,您需要解决此问题。

到目前为止,我已经考虑了两个途径:

(1)关注Guy的帖子here并使用BroadcastReceiver

(2)使用以下代码尝试通过shell命令触发键事件。

final Runtime r = Runtime.getRuntime();
    try {
        Process process = r.exec("input keyevent 5");
        InputStream stream = process.getErrorStream();
        log.v("Process Error Stream: " +stream.toString());
        log.v("Sending shell command to Answer Call");
    } catch (Exception e) {
        log.v("Stack Trace: " + e.getStackTrace().toString());
        e.printStackTrace();
    } 

我使用这个是因为keyevent 5是根据谷歌的KeyEvent.CALL而且它在adb中使用

adb shell input keyevent 5

我的问题是,我做错了什么?因为逻辑上这两种方法都有意义,但它们都不起作用,甚至不会产生任何类型的运行时错误。

干杯

3 个答案:

答案 0 :(得分:6)

经过数天的研究,我发现使用广播接收器路由和runtime.exec()路由时,根据Android API无法接听Android 4.0.3中的电话。

对于那些仍然想知道的人,我确实找到了一些有用的信息...你可以使用命令adb通过adb shell input keyevent 5接听电话.5是呼叫按钮的关键代码,在Android中它是KEYEVENT_CALL

答案 1 :(得分:4)

这适用于Android 2.2到4.0,现在将try catch添加到最后一行后,它适用于4.1.2和4.2坦率地说不知道它是如何工作的,但它对我有用。

          Log.d(tag, "InSecond Method Ans Call");
    // 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));
    sendOrderedBroadcast(buttonUp, "android.permission.CALL_PRIVILEGED");
    Intent headSetUnPluggedintent = new Intent(Intent.ACTION_HEADSET_PLUG);
    headSetUnPluggedintent.addFlags(Intent.FLAG_RECEIVER_REGISTERED_ONLY);
    headSetUnPluggedintent.putExtra("state", 0);
    headSetUnPluggedintent.putExtra("name", "Headset");
    try {
        sendOrderedBroadcast(headSetUnPluggedintent, null);
    } catch (Exception e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    }

这对我在Android 4.1.2中工作以及我在4.2上测试过 这仍然是一个处理的例外。

答案 2 :(得分:1)