实现思路利用电话接收广播判断来电号码和指定的电话号码做一个比较,然后在电话响铃状态将手机的响铃手动设置为静音,接着再播放自己想要的铃声(使用系统的播放器 MediaPlayer)。再到手机的摘机状态将手动播放的音乐结束掉,再到电话挂断状态后,手机设置手机电话铃声为正常。

获取电话的几个状态:


  1. public class CallStateListener extends PhoneStateListener {  
  2.         @Override  
  3.         public void onCallStateChanged(int state, String incomingNumber) {  
  4.             // TODO Auto-generated method stub  
  5.             super.onCallStateChanged(state, incomingNumber);  
  6.             switch (state) {  
  7.             case TelephonyManager.CALL_STATE_IDLE: // 没有来电或 挂断 电话处于非活动状态  
  8. break; 
  9. case TelephonyManager.CALL_STATE_RINGING: // 响铃时 
  10. break; 
  11. case TelephonyManager.CALL_STATE_OFFHOOK: // 接起电话 
  12. break; 

设置手机为静音方法


  1. try { 
  2.                         AudioManager audioManager = (AudioManager) Context 
  3.                                 .getSystemService(Context.AUDIO_SERVICE); 
  4.                         if (audioManager != null) { 
  5.                             /* 设置响铃模式为静音? */ 
  6.                             audioManager 
  7.                                     .setRingerMode(AudioManager.RINGER_MODE_SILENT); 
  8.                             audioManager 
  9.                                     .getStreamVolume(AudioManager.STREAM_RING); 
  10.  
  11.             } 
  12.                     } catch (Exception e) { 
  13.                         break; 
  14.                     } 

设置手机响铃为正常的方法


  1. try { 
  2.                     AudioManager audioManager = (AudioManager) mContext 
  3.                             .getSystemService(Context.AUDIO_SERVICE); 
  4.                     if (audioManager != null) { 
  5.                         /* 设置手机为待机时响铃为正常模式 */ 
  6.                         audioManager 
  7.                                 .setRingerMode(AudioManager.RINGER_MODE_NORMAL); 
  8.                         audioManager.getStreamVolume(AudioManager.STREAM_RING); 
  9.                     } 
  10.                 } catch (Exception e) { 
  11.                 } 

设置音乐播放,这里将一个MP3文件存放在工程目录的assets文件夹内

先获取MediaPlayer对象


  1. private static MediaPlayer getPlayer() { 
  2.         if (player == null) { 
  3.             player = new MediaPlayer(); 
  4.         } 
  5.         return player; 
  6.     } 

获取播放MP3文件和开始,结束这里用一个方法封装好了,通过一个int类型的值来判断是播放还是结束播放


  1. private void playMusic(int i) { 
  2.         AssetManager assetManager = mContext.getAssets(); 
  3.         String fileName = “text.mp3”
  4.         boolean needLoop = true
  5.         AssetFileDescriptor fileDescriptor; 
  6.         MediaPlayer mediaPlayer = getPlayer(); 
  7.         try { 
  8.             if (i == 0) { 
  9.                 mediaPlayer.reset(); 
  10.                 fileDescriptor = assetManager.openFd(fileName); 
  11.                 mediaPlayer.setDataSource(fileDescriptor.getFileDescriptor(), 
  12.                         fileDescriptor.getStartOffset(), 
  13.                         fileDescriptor.getLength()); 
  14.                 mediaPlayer.prepare(); 
  15.                 mediaPlayer.start(); 
  16.                 mediaPlayer.setLooping(needLoop); 
  17.             } else { 
  18.                 if (mediaPlayer != null) { 
  19.                     mediaPlayer.stop(); 
  20.                 } 
  21.             } 
  22.         } catch (IllegalArgumentException e) { 
  23.             // TODO Auto-generated catch block 
  24.             e.printStackTrace(); 
  25.         } catch (IllegalStateException e) { 
  26.             // TODO Auto-generated catch block 
  27.             e.printStackTrace(); 
  28.         } catch (IOException e) { 
  29.             // TODO Auto-generated catch block 
  30.             e.printStackTrace(); 
  31.         } 
  32.  
  33.     }