打电话和来电话时处理 媒体音量的问题。现将逻辑说明如下:
1.来电话
监听类 PhoneStateListener
第一种状态:响铃:TelephonyManager.CALL_STATE_RINGING
第二种状态:接起电话: TelephonyManager.CALL_STATE_OFFHOOK
第三种状态:挂电话:TelephonyManager.CALL_STATE_IDLE
@Override
public void onCallStateChanged(int state, String incomingNumber) {
if(DBG) Log.v(TAG,"onCallStateChanged()");
AudioManager audioManager = (AudioManager) getSystemService(Context.AUDIO_SERVICE);
// 当有电话进来时
if (state == TelephonyManager.CALL_STATE_RINGING) {
mbPhoneCall = true;
curVolume = audioManager.getStreamVolume(AudioManager.STREAM_MUSIC);// 获取当前音量值
audioManager.setStreamVolume(AudioManager.STREAM_MUSIC, 0, 0);//设置当前音量值为0
} else if (state == TelephonyManager.CALL_STATE_OFFHOOK) {
// 当有电话在等时
if(!mbPhoneCall) {
mbPhoneCall = true;
curVolume = audioManager.getStreamVolume(AudioManager.STREAM_MUSIC);// 获取当前音量值
audioManager.setStreamVolume(AudioManager.STREAM_MUSIC, 0, 0);//设置当前音量值为0
}
} else if (state == TelephonyManager.CALL_STATE_IDLE) {
// 当挂断电话时打电话和来电话时处理 媒体音量的问题。现将逻辑说明如下:
1.来电话
监听类 PhoneStateListener
第一种状态:响铃:TelephonyManager.CALL_STATE_RINGING
第二种状态:接起电话: TelephonyManager.CALL_STATE_OFFHOOK
第三种状态:挂电话:TelephonyManager.CALL_STATE_IDLE
private PhoneStateListener mPhoneStateListener = new PhoneStateListener() {
@Override
public void onCallStateChanged(int state, String incomingNumber) {
if(DBG) Log.v(TAG,"onCallStateChanged()");
AudioManager audioManager = (AudioManager) getSystemService(Context.AUDIO_SERVICE);
// 当有电话进来时
if (state == TelephonyManager.CALL_STATE_RINGING) {
mbPhoneCall = true;
curVolume = audioManager.getStreamVolume(AudioManager.STREAM_MUSIC);// 获取当前音量值
audioManager.setStreamVolume(AudioManager.STREAM_MUSIC, 0, 0);//设置当前音量值为0
} else if (state == TelephonyManager.CALL_STATE_OFFHOOK) {
// 当有电话在等时
if(!mbPhoneCall) {
打电话和来电话时处理 媒体音量的问题。现将逻辑说明如下:
1.来电话
监听类 PhoneStateListener
第一种状态:响铃:TelephonyManager.CALL_STATE_RINGING
第二种状态:接起电话: TelephonyManager.CALL_STATE_OFFHOOK
第三种状态:挂电话:TelephonyManager.CALL_STATE_IDLE
@Override
public void onCallStateChanged(int state, String incomingNumber) {
if(DBG) Log.v(TAG,"onCallStateChanged()");
AudioManager audioManager = (AudioManager) getSystemService(Context.AUDIO_SERVICE);
// 当有电话进来时
if (state == TelephonyManager.CALL_STATE_RINGING) {
mbPhoneCall = true;
curVolume = audioManager.getStreamVolume(AudioManager.STREAM_MUSIC);// 获取当前音量值
audioManager.setStreamVolume(AudioManager.STREAM_MUSIC, 0, 0);//设置当前音量值为0
} else if (state == TelephonyManager.CALL_STATE_OFFHOOK) {
// 当有电话在等时
if(!mbPhoneCall) {
mbPhoneCall = true;
curVolume = audioManager.getStreamVolume(AudioManager.STREAM_MUSIC);// 获取当前音量值
audioManager.setStreamVolume(AudioManager.STREAM_MUSIC, 0, 0);//设置当前音量值为0
}
} else if (state == TelephonyManager.CALL_STATE_IDLE) {
// 当挂断电话时
if(mbPhoneCall) {
mbPhoneCall = false;
audioManager.setStreamVolume(AudioManager.STREAM_MUSIC, curVolume, 0); //还原音量值
}
}
}
};
2 打电话
HTC的手机开发过程中,在打电话的时候,没有发送该广播,只触发了电话监听类。状态为 TelephonyManager.CALL_STATE_OFFHOOK
第一种状态:打电话 监听类会触发 state = TelephonyManager.CALL_STATE_OFFHOOK,但是广播不一定能收到,HTC的手机就不会。
第二种状态:对方接通电话,state = TelephonyManager.CALL_STATE_OFFHOOK
第三种状态:挂电话,state = TelephonyManager.CALL_STATE_IDLE
// 添加电话监听类
IntentFilter filterOutCall = new IntentFilter();
filterOutCall.addAction(Intent.ACTION_NEW_OUTGOING_CALL);
registerReceiver(mPhoneOutCallListener, filterOutCall);
广播接收 private BroadcastReceiver mPhoneOutCallListener = new BroadcastReceiver() {
@Override
public void onReceive(Context context, Intent intent) {
AudioManager audioManager = (AudioManager) getSystemService(Context.AUDIO_SERVICE);
curVolume = audioManager.getStreamVolume(AudioManager.STREAM_MUSIC);
mbPhoneCall = true;
}
};
mbPhoneCall = true;
curVolume = audioManager.getStreamVolume(AudioManager.STREAM_MUSIC);// 获取当前音量值
audioManager.setStreamVolume(AudioManager.STREAM_MUSIC, 0, 0);//设置当前音量值为0
}
} else if (state == TelephonyManager.CALL_STATE_IDLE) {
// 当挂断电话时
if(mbPhoneCall) {
mbPhoneCall = false;
audioManager.setStreamVolume(AudioManager.STREAM_MUSIC, curVolume, 0); //还原音量值
}
}
}
};
2 打电话
HTC的手机开发过程中,在打电话的时候,没有发送该广播,只触发了电话监听类。状态为 TelephonyManager.CALL_STATE_OFFHOOK
第一种状态:打电话 监听类会触发 state = TelephonyManager.CALL_STATE_OFFHOOK,但是广播不一定能收到,HTC的手机就不会。
第二种状态:对方接通电话,state = TelephonyManager.CALL_STATE_OFFHOOK
第三种状态:挂电话,state = TelephonyManager.CALL_STATE_IDLE
// 添加电话监听类
IntentFilter filterOutCall = new IntentFilter();
filterOutCall.addAction(Intent.ACTION_NEW_OUTGOING_CALL);
registerReceiver(mPhoneOutCallListener, filterOutCall);
广播接收 private BroadcastReceiver mPhoneOutCallListener = new BroadcastReceiver() {
@Override
public void onReceive(Context context, Intent intent) {
AudioManager audioManager = (AudioManager) getSystemService(Context.AUDIO_SERVICE);
curVolume = audioManager.getStreamVolume(AudioManager.STREAM_MUSIC);
mbPhoneCall = true;
}
};
if(mbPhoneCall) {
mbPhoneCall = false;
audioManager.setStreamVolume(AudioManager.STREAM_MUSIC, curVolume, 0); //还原音量值
}
}
}
};
2 打电话
HTC的手机开发过程中,在打电话的时候,没有发送该广播,只触发了电话监听类。状态为 TelephonyManager.CALL_STATE_OFFHOOK
第一种状态:打电话 监听类会触发 state = TelephonyManager.CALL_STATE_OFFHOOK,但是广播不一定能收到,HTC的手机就不会。
第二种状态:对方接通电话,state = TelephonyManager.CALL_STATE_OFFHOOK
第三种状态:挂电话,state = TelephonyManager.CALL_STATE_IDLE
// 添加电话监听类
IntentFilter filterOutCall = new IntentFilter();
filterOutCall.addAction(Intent.ACTION_NEW_OUTGOING_CALL);
registerReceiver(mPhoneOutCallListener, filterOutCall);
广播接收 private BroadcastReceiver mPhoneOutCallListener = new BroadcastReceiver() {
@Override
public void onReceive(Context context, Intent intent) {
AudioManager audioManager = (AudioManager) getSystemService(Context.AUDIO_SERVICE);
curVolume = audioManager.getStreamVolume(AudioManager.STREAM_MUSIC);
mbPhoneCall = true;
}
};
1、例一:
- package com.test.telephone;
- import android.app.Activity;
- import android.content.Context;
- import android.os.Bundle;
- import android.telephony.PhoneStateListener;
- import android.telephony.TelephonyManager;
- import android.util.Log;
- import android.widget.TextView;
- public class ActivityMain extends Activity {
- private static final String TAG = "Telephony";
- TextView view = null;
- @Override
- protected void onCreate(Bundle savedInstanceState) {
- super.onCreate(savedInstanceState);
- // 获取电话管理的一个类实例
- TelephonyManager mTelephonyMgr = (TelephonyManager) this
- .getSystemService(Context.TELEPHONY_SERVICE);
- // Registers a listener object to receive notification of changes in
- // specified telephony states
- // 建立一个监听器来实时监听电话的通话状态
- mTelephonyMgr.listen(new TeleListener(),
- PhoneStateListener.LISTEN_CALL_STATE);
- view = new TextView(this);
- view.setText("listen the state of phone\n");
- setContentView(view);
- }
- class TeleListener extends PhoneStateListener {
- @Override
- public void onCallStateChanged(int state, String incomingNumber) {
- super.onCallStateChanged(state, incomingNumber);
- switch (state) {
- // 当处于待机状态中
- case TelephonyManager.CALL_STATE_IDLE: {
- Log.e(TAG, "CALL_STATE_IDLE");
- view.append("CALL_STATE_IDLE " + "\n");
- break;
- }
- // 当处于通话中
- case TelephonyManager.CALL_STATE_OFFHOOK: {
- Log.e(TAG, "CALL_STATE_OFFHOOK");
- view.append("CALL_STATE_OFFHOOK" + "\n");
- break;
- }
- // 当处于拨号状态中..
- case TelephonyManager.CALL_STATE_RINGING: {
- Log.e(TAG, "CALL_STATE_RINGING");
- view.append("CALL_STATE_RINGING" + "\n");
- break;
- }
- default:
- break;
- }
- }
- }
- }
- 权限:<uses-permission android:name="android.permission.READ_PHONE_STATE" />
2、例二:
这里我们只需要覆盖onCallStateChanged()方法即可监听呼叫状态。在TelephonyManager中定义了三种状态,分别是振铃(RINGING),摘机(OFFHOOK)和空闲(IDLE),我们通过state的值就知道现在的电话状态了。
获得了TelephonyManager接口之后,调用listen()方法即可实现Android监听通话。
- mTelephonyMgr.listen(new TeleListener(),
- PhoneStateListener.LISTEN_CALL_STATE);
下面是个简单的测试例子,只是把呼叫状态追加到TextView之上。
- package com.j2medev;
- import android.app.Activity;
- import android.content.Context;
- import android.os.Bundle;
- import android.telephony.PhoneStateListener;
- import android.telephony.TelephonyManager;
- import android.util.Log;
- import android.widget.TextView;
- public class Telephony extends Activity {
- private static final String TAG = "Telephony";
- TextView view = null;
- @Override
- protected void onCreate(Bundle savedInstanceState) {
- super.onCreate(savedInstanceState);
- TelephonyManager mTelephonyMgr = (TelephonyManager) this
- .getSystemService(Context.TELEPHONY_SERVICE);
- mTelephonyMgr.listen(new TeleListener(),
- PhoneStateListener.LISTEN_CALL_STATE);
- view = new TextView(this);
- view.setText("listen the state of phone\n");
- setContentView(view);
- }
- class TeleListener extends PhoneStateListener {
- @Override
- public void onCallStateChanged(int state,
String incomingNumber) { - super.onCallStateChanged(state, incomingNumber);
- switch (state) {
- case TelephonyManager.CALL_STATE_IDLE: {
- Log.e(TAG, "CALL_STATE_IDLE");
- view.append("CALL_STATE_IDLE " + "\n");
- break;
- }
- case TelephonyManager.CALL_STATE_OFFHOOK: {
- Log.e(TAG, "CALL_STATE_OFFHOOK");
- view.append("CALL_STATE_OFFHOOK" + "\n");
- break;
- }
- case TelephonyManager.CALL_STATE_RINGING: {
- Log.e(TAG, "CALL_STATE_RINGING");
- view.append("CALL_STATE_RINGING" + "\n");
- break;
- }
- default:
- break;
- }
- }
- }
- }
不要忘记在AndroidManifest.xml里面添加个permission.
- < uses-permission android:name=
"android.permission.READ_PHONE_STATE" />