[英]Detecting End of Call with Broadcast Receiver inside a service
我正在寫一個Android應用程序,我需要在服務中運行廣播接收器,接收器檢測到有來電時,當呼叫結束或應答時,服務將手機置於靜音模式,接收器檢測到有一個來電,如果有一個來電,接收機將振鈴模式設置為正常響鈴和振動,當接聽或接聽電話時,接收機再次將振鈴器設置為靜音模式。
這是我的接收者:
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
}
}
};
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.