我拦截了来电并在标准屏幕上显示我的活动。 在这个活动中,我有按钮“接听电话”和“拒绝电话”,但我不能这样做。
我找到了两种解决方案来接听/拒绝电话号码:
有以下内容:
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");
}
从这里http://www.codeproject.com/Tips/578817/Reject-and-Accept-an-Incoming-Call
然而没什么!我点击按钮并相应地调用上面的方法,没有任何反应。 我在几台设备上进行了测试,结果相同。
嗯,然后我成功地回答了三星nexus one,但没有感觉HTC。拒绝功能对两者都不起作用。答案 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" />