Android 系统中电话服务介绍

w3270818 贡献于2012-05-30

作者 wj  创建于2009-12-30 05:58:00   修改者wj  修改于2009-12-31 03:19:00字数4937

文档摘要:在context中的系统服务有多种,其中有一个关于电话的服务TELEPHONY_SERVICE。对于该电话服务,虽然系统没有给我们直接操作该服务的接口,但是封装了一个电话服务的管理类来给上层开发者使用,就是下面我们要讲的TelephonyManager,TelephonyManager不能通过new得到,通过Context.getSystemService(Context.TELEPHONY_SERVICE).可以获得TelephonyManager,TelephonyManager是一个提供设备上电话服务相关信息的类
关键词:

系统服务中关于电话服务的介绍 在context中的系统服务有多种,其中有一个关于电话的服务TELEPHONY_SERVICE。对于该电话服务,虽然系统没有给我们直接操作该服务的接口,但是封装了一个电话服务的管理类来给上层开发者使用,就是下面我们要讲的TelephonyManager,TelephonyManager不能通过new得到,通过Context.getSystemService(Context.TELEPHONY_SERVICE).可以获得TelephonyManager,TelephonyManager是一个提供设备上电话服务相关信息的类,那么通过这个管理类我们可以做些什么呢? 一:获得设备的相关信息 查看API文档我们发现,在TelephonyManager类中有很多的get方法,通过这些get方法我们可以获得一些设备上的电话信息。 getCallState() 获得通话状态 getDeviceId() 获得设备的IMEI码 getDeviceSoftwareVersion() 获得设备的软件版本 getLine1Number() 获得电话号码 getNetworkCountryIso() 获得使用的网络的国家代码 getNetworkOperatorName() 获得当前网络的名称 getNetworkType() 获得当前网络类型 getPhoneType() 获得手机类型 getSimCountryIso() 获得SIM卡的提供者的国家代码 getSimOperatorName () 获得SIM卡服务提供商的名字 getSimState() 获得SIM卡的状态 getVoiceMailNumber() 获得语音信箱的号码 以上获取信息的方法只是其中的一部分,对于其他方法大家可以参考API文档。 二:对设备中某些状态进行监听 在TelephonyManager中还有一个重要的方法,那就是listen(PhoneStateListener listener, int events),通过这个方法我们可以监听电话状态(来电,空闲,接听),网络信号的强度,网络数据的连接等等。那么我们如何才能监听这些时间呢? 下面我们以监听电话状态为例,看下如何来实现: 首先我们需要获得TelephonyManager的对象,通过Context的getSystemService方法得到,如下代码: TelephonyManager mTelephonyMgr = (TelephonyManager)getSystemService(Context.TELEPHONY_SERVICE); 得到TelephonyManager对象后,需要调用它的listen方法来设置监听。我们发现这个方法有两个参数,第一个参数是一个PhoneStateListener对象,这个类是一个手机状态改变的监听类,这个类有下图所示的几个方法。 我们需要编写一个类继承此PhoneStateListener类,然后根据我们需要监听的状态改变类型,重写此父类中相应的方法。第二个参数events是一个int型,是我们需要监听的状态类型,通过文档我们发现可以监听的类型有下列几种: 通过TelephonyManager开启电话状态改变的监听代码如下所示: mTelephonyMgr.listen(new TeleListener(), PhoneStateListener.LISTEN_CALL_STATE); TeleListener为PhoneStateListener的子类,要实现状态改变的监听需要重写了电话状态改变的方法。 下面我们以播放音乐服务为例简要说明下TelephonyManager对于监听的使用: public class MusicService extends Service { MediaPlayer mp; final RemoteCallbackList mCallbacks = new RemoteCallbackList(); @Override public void onCreate() { // TODO Auto-generated method stub super.onCreate(); mHandler.sendEmptyMessage(REPORT_MSG); TelephonyManager mTelephonyMgr = (TelephonyManager) this .getSystemService(Context.TELEPHONY_SERVICE); mTelephonyMgr.listen(new TeleListener(), PhoneStateListener.LISTEN_CALL_STATE); } IMusicService.Stub binder = new Stub() { public String musicInfo() throws RemoteException { // TODO Auto-generated method stub return null; } public String musicName() throws RemoteException { // TODO Auto-generated method stub return null; } public void pauseMusic() throws RemoteException { // TODO Auto-generated method stub if (mp != null) { mp.pause(); } } public void playMusic(IMusicServiceback im) throws RemoteException { if (mp == null) { // TODO Auto-generated method stub mp = MediaPlayer.create(MusicService.this, R.raw.alizee); } if (im != null) { mCallbacks.register(im); } mp.start(); } public void stopMusic() throws RemoteException { // TODO Auto-generated method stub if (mp != null) { mp.stop(); mp.release(); } mp = null; } public void rePlayMusic(IMusicServiceback im) throws RemoteException { } public void nextSong(IMusicServiceback im) throws RemoteException { } public void setVolume(int v) throws RemoteException { } }; @Override public void onDestroy() { // TODO Auto-generated method stub super.onDestroy(); if (mp != null) { mp.release(); mp = null; } mHandler.removeMessages(REPORT_MSG); } /* * (non-Javadoc) * * @see android.app.Service#onBind(android.content.Intent) */ @Override public IBinder onBind(Intent intent) { // TODO Auto-generated method stub return binder; } private static final int REPORT_MSG = 1; /** * Our Handler used to execute operations on the main thread. This is used * to schedule increments of our value. */ private final Handler mHandler = new Handler() { @Override public void handleMessage(Message msg) { switch (msg.what) { // It is time to bump the value! case REPORT_MSG: { // Up it goes. int value = 0; int total = 0; if (mp != null) { value = mp.getCurrentPosition(); total = mp.getDuration(); } // Broadcast to all clients the new value. final int N = mCallbacks.beginBroadcast(); for (int i = 0; i < N; i++) { try { mCallbacks.getBroadcastItem(i).valueChanged(value, total); } catch (RemoteException e) { // The RemoteCallbackList will take care of removing // the dead object for us. } } mCallbacks.finishBroadcast(); // Repeat every 1 second. sendMessageDelayed(obtainMessage(REPORT_MSG), 1 * 1000); } break; default: super.handleMessage(msg); } } }; class TeleListener extends PhoneStateListener { @Override public void onCallStateChanged(int state, String incomingNumber) { super.onCallStateChanged(state, incomingNumber); switch (state) { case TelephonyManager.CALL_STATE_IDLE: { if (mp != null) { mp.start(); } break; } case TelephonyManager.CALL_STATE_OFFHOOK: { break; } case TelephonyManager.CALL_STATE_RINGING: { if (mp != null) { mp.pause(); } break; } default: break; } } } } 在这个自定义播放音乐的服务中,我们需要在有电话呼入时,暂停播放音乐,在通话结束或者拒听电话后可以继续我们的音乐播放服务。对于自定义服务此处就不多做说明了,在上面的服务中,为了实现电话的监听,首先我们需要得到电话服务的管理类对象,并调用该对象的listen注册一个我们需要的状态类型的监听器。 注册时我们需要一个PhoneStateListener对象,我们写了一个PhoneStateListener的子类TeleListener,并重写了该类的关于电话状态改变的方法onCallStateChanged,在这个方法中有两个参数,第一个为状态常量,第二个为呼入的电话号码,查阅API我们发现对于电话的状态给我们提供了三种状态: TelephonyManager.CALL_STATE_IDLE 空闲状态 TelephonyManager.CALL_STATE_OFFHOOK 摘起状态,就接听状态 TelephonyManager.CALL_STATE_RINGING 振铃状态 我们使用switch对状态进行判断,在振铃状态时,我们调用MediaPlayer mp的pause方法暂停播放,当电话状态变为空闲状态时,再调用start的方法。运行此服务的应用,我们使用模拟器模拟电话呼入,界面会从播放界面跳转到呼入界面,如下: 我们可以按返回键返回我们的播放界面,发现播放进度停止在1分30秒,耳机中音乐也停止了。 当我们按下红色挂机键后,我们可以发现播放进度重1分31秒开始增加。 对其他状态类型改变的监听,大家可以参考上述电话状态改变监听的方法和相应的API文档进行相应的处理,重写相应的方法,在方法中根据不同状态实现我们不同的逻辑。

下载文档到电脑,查找使用更方便

文档的实际排版效果,会与网站的显示效果略有不同!!

需要 10 金币 [ 分享文档获得金币 ] 1 人已下载

下载文档