目的
androidアプリで、電話の着信が来た場合、アプリ側で受話して自動的に通話中にしたい。
環境
android7.1
問題点
TelephonyManagerで、CALL_STATE_RINGING(着信中)の状態で、
KEYCODE_HEADSETHOOKのキーイベント発生させても、通話状態に遷移しない。
Android StudioのTerminalから、adb shellでキーイベントを発生させると、
通話状態に遷移した。
adb shell input keyevent KEYCODE_HEADSETHOOK
adbコマンドでは状態遷移したが、ソフトからは遷移できない。
権限が不足しているのだろうか?
ソース
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
final TextView text1 = findViewById(R.id.text);
TelephonyManager telephonyManager = (TelephonyManager) getSystemService(Context.TELEPHONY_SERVICE);
telephonyManager.listen(new PhoneStateListener(){
// PhoneStateListenerの`onCallStateChanged`をOverride
@Override
public void onCallStateChanged(int state, String incomingNumber) {
switch (state) {
case TelephonyManager.CALL_STATE_RINGING:
/* 着信 */
text1.setText("Call State Changed: CALL_STATE_RINGING");
/* 通話を開始する */
dispatchKeyEvent(new KeyEvent(KeyEvent.ACTION_DOWN, KeyEvent.KEYCODE_HEADSETHOOK));
dispatchKeyEvent(new KeyEvent(KeyEvent.ACTION_UP, KeyEvent.KEYCODE_HEADSETHOOK));
break;
case TelephonyManager.CALL_STATE_OFFHOOK:
/* 通話 */
text1.setText("Call State Changed: CALL_STATE_OFFHOOK");
break;
case TelephonyManager.CALL_STATE_IDLE:
/* 待受 */
text1.setText("Call State Changed: CALL_STATE_IDLE");
break;
}
}
}, PhoneStateListener.LISTEN_CALL_STATE);
}
参考サイト
「電話着信への応答と拒否」
https://qiita.com/b-wind/items/7e6aac39eefaa9412dee