Java 使用服务内的广播接收器检测呼叫结束
我正在编写一个Android应用程序,我需要在服务中运行广播接收器,接收器检测何时有来电,何时通话结束或接听,服务将手机置于静音模式,接收器检测何时有来电,如果有来电,接收器将振铃器模式设置为响铃并正常振动,当呼叫接听或结束时,接收器将振铃器再次设置为静音模式 这是我的听筒:Java 使用服务内的广播接收器检测呼叫结束,java,android,broadcastreceiver,android-service,Java,Android,Broadcastreceiver,Android Service,我正在编写一个Android应用程序,我需要在服务中运行广播接收器,接收器检测何时有来电,何时通话结束或接听,服务将手机置于静音模式,接收器检测何时有来电,如果有来电,接收器将振铃器模式设置为响铃并正常振动,当呼叫接听或结束时,接收器将振铃器再次设置为静音模式 这是我的听筒: private final BroadcastReceiver CallReceiver = new BroadcastReceiver() { public void onReceive(Context cont
private final BroadcastReceiver CallReceiver = new BroadcastReceiver() {
public void onReceive(Context context, Intent intent) {
AudioManager amanager=(AudioManager)getSystemService(Context.AUDIO_SERVICE);
amanager = (AudioManager) context.getSystemService(Context.AUDIO_SERVICE);
String state = intent.getStringExtra(TelephonyManager.EXTRA_STATE);
if (TelephonyManager.EXTRA_STATE_RINGING.equals(state))
{
amanager.setRingerMode(2); //Ringer ON
}
if (TelephonyManager.EXTRA_STATE_IDLE.equals(state))
{
amanager.setRingerMode(0); //Ringer Silent
}
if (TelephonyManager.EXTRA_STATE_OFFHOOK.equals(state))
{
amanager.setRingerMode(0); ////Ringer Silent
}
}
};
在“我的服务”的onStartCommand方法中:
IntentFilter filter = new IntentFilter();
filter.addAction(TelephonyManager.ACTION_PHONE_STATE_CHANGED);
registerReceiver(CallReceiver, filter);
该服务正在成功运行,接收器检测到何时有来电,但随后应用程序崩溃,你知道为什么会发生这种情况吗?
谢谢你的帮助
编辑:
我解决了这个问题,结果是我在清单中写了错误的操作,更改后它不会崩溃
但现在,接收器只检测到来电,但没有检测到呼叫何时接听或结束,它确实检测到了几次,但大多数情况下它没有,振铃器在呼叫结束后仍然打开!
有什么想法吗?终于找到了解决办法!
在将振铃器模式设置为静音之前,我增加了一秒钟的延迟,我不知道这个解决方案是如何工作的,但它做到了
private final BroadcastReceiver CallReceiver = new BroadcastReceiver() {
public void onReceive(Context context, Intent intent) {
AudioManager amanager=(AudioManager)getSystemService(Context.AUDIO_SERVICE);
amanager = (AudioManager) context.getSystemService(Context.AUDIO_SERVICE);
String state = intent.getStringExtra(TelephonyManager.EXTRA_STATE);
if (TelephonyManager.EXTRA_STATE_IDLE.equals(state))
{
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
amanager.setRingerMode(0); //Ringer Silent
}
if (TelephonyManager.EXTRA_STATE_OFFHOOK.equals(state))
{
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
amanager.setRingerMode(0); ////Ringer Silent
}
if (TelephonyManager.EXTRA_STATE_RINGING.equals(state))
{
amanager.setRingerMode(2); //Ringer ON
}
}
};
查看logcat中的崩溃并发布stacktrace和错误消息我修复了崩溃,但现在接收器没有检测到通话结束,通话结束后手机仍处于正常振铃模式。您如何启动/停止服务?从
onStartCommand()
返回什么?当调用完成时,您能否判断您的服务是否仍在运行?我正在从主活动onCreate()方法启动该服务,方法是通过intent:intent service=new intent(这是CallDetectService.class)启动该服务;startService(服务);我正在从onStartCommand()返回此命令:return Service.START\u NOT\u STICKY;我不确定该服务是否仍在运行,但在我进行修复后,它没有显示任何终止的迹象。请尝试从onStartCommand()
返回“START\u STICKY”。这将保持您的服务运行。我猜你的服务在打电话的时候被取消了。