android 之通话录音

在进行电话录音中,我们需要监听Phone的状态,通过PhoneStateListener 对phone的状态判断当前通话中的各种状态,根据状态进行对应的处理,

1,注册phone状态Receiver

 

 <receiver android:name="com.internal.telephony.TelReceiver" android:enabled="true">
	         <intent-filter>
	          <action android:name="android.intent.action.NEW_OUTGOING_CALL"/>
	          <action android:name="android.intent.action.PHONE_STATE"/>
	         
	          <action android:name="android.intent.action.CAL"/>
	         
	         </intent-filter>
        </receiver>

 这里使用service进行具体实现

import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;

public class TelReceiver extends BroadcastReceiver {

	final String tel="android.intent.action.PHONE_STATE";
	@Override
	public void onReceive(Context context, Intent intent) {
		
		if(intent!=null){
			if(intent.getAction().equals(tel)){
				Intent i=new Intent("com.tel.listner");
				context.startService(i);
			}
		}
	}

}

 录音处理:

import java.io.File;
import java.io.IOException;
import java.text.SimpleDateFormat;
import java.util.Date;

import android.app.Service;
import android.content.ContentResolver;
import android.content.Context;
import android.content.Intent;
import android.database.Cursor;
import android.media.MediaRecorder;
import android.os.Environment;
import android.os.IBinder;
import android.provider.ContactsContract;
import android.telephony.PhoneStateListener;
import android.telephony.TelephonyManager;
import android.util.Log;


public class TelListenner extends Service{


	private final String tag="com.tel.listner";
	
	@Override
	public void onCreate() {
	
        TelephonyManager telManager = (TelephonyManager) getSystemService(Context.TELEPHONY_SERVICE);
        TelListner listener = new TelListner() ;
     // 监听电话的状态
        telManager.listen(listener, PhoneStateListener.LISTEN_CALL_STATE);
        
		super.onCreate();
	}

	@Override
	public void onDestroy() {
		
		super.onDestroy();
	}

	class TelListner extends PhoneStateListener{
		private String number;//监听电话号码
	    private boolean isRecord;
	    private MediaRecorder recorder;
	    
		@Override
		public void onCallStateChanged(int state, String incomingNumber) {
			   switch (state) {
               case TelephonyManager.CALL_STATE_IDLE:/* 无任何状态 */
                   number = null;
                   if (recorder != null && isRecord) {
                       Log.e("msg", "record ok");
                       recorder.stop();//录音完成
                       recorder.reset(); 
                       recorder.release();
                       isRecord = false;//录音完成,改变状态标志
                   }
                   break;
               case TelephonyManager.CALL_STATE_OFFHOOK:/* 接起电话 */
                   
            	   	number=incomingNumber;
                	   Log.e("msg", "recording");// 录制声音,这是录音的核心代码
                       recorder = new MediaRecorder();
                       recorder.setAudioSource(MediaRecorder.AudioSource.MIC);// 定义声音来自于麦克风
                       recorder.setOutputFormat(MediaRecorder.OutputFormat.DEFAULT);//存储格式
                       recorder.setAudioEncoder(MediaRecorder.AudioEncoder.DEFAULT);//设置编码
                       SimpleDateFormat format = new SimpleDateFormat("yy-MM-dd-HH:mm:ss");//此处定义一个format类,方便对录音文件进行命名
                       String fileName = number + "_"    + format.format(new Date());
                       File file=new File(Environment.getExternalStorageDirectory(),"myapp");
                       if(!file.exists()){
                    	   file.mkdirs();
                       }
                       recorder.setOutputFile(file.getAbsolutePath()+File.separator+fileName + ".amr");
				try {
					recorder.prepare();
					  recorder.start(); // 开始刻录
                      isRecord = true;
				} catch (IllegalStateException e) {
					e.printStackTrace();
				} catch (IOException e) {
					e.printStackTrace();
				}
                   break;
               case TelephonyManager.CALL_STATE_RINGING:/* 电话进来 */
            	   Log.e("msg", "coming");
                   number = incomingNumber;
                   getContactPeople(incomingNumber);
                   break;

               default:
                   break;
               }
		}
		
	}
	/**
	 * 根据来电号码查找联系人
	 * @param incomingNumber
	 */
	private void getContactPeople(String incomingNumber){
		
	    ContentResolver contentResolver = getContentResolver();
	    Cursor cursor = null;

	    //查询字段名称
	    String[] projection = new String[]{ ContactsContract.Contacts._ID, ContactsContract.Contacts.DISPLAY_NAME,
	        ContactsContract.CommonDataKinds.Phone.NUMBER };

	    //根据电话号码查找该联系人
	    cursor = contentResolver.query(
	        ContactsContract.CommonDataKinds.Phone.CONTENT_URI, projection,
	        ContactsContract.CommonDataKinds.Phone.NUMBER + "=?", new String[]
	        { incomingNumber }, null);

	    // 找不到联系人
	    if (cursor.getCount() == 0){
	    	Log.e("msg", "unknown Number:" + incomingNumber);
	    } 
	    else if (cursor.getCount() > 0){
	      cursor.moveToFirst();
	      String name = cursor.getString(1);
	      Log.e("msg", name+" :" + incomingNumber);
	    }
	    cursor.close();
	    cursor=null;
	  }
	
	@Override
	public IBinder onBind(Intent arg0) {
		
		return null;
	}
	
}

 

录音还开可这样设置

MediaRecorder recorder = new MediaRecorder();
recorder.setAudioSource(MediaRecorder.AudioSource.VOICE_CALL);
可以录制上下行端口的通话语音


注册服务:

 <service android:name="com.internal.telephony.TelListenner">
        	<intent-filter>  
                 <action android:name="com.tel.listner"/>  
             </intent-filter> 
        </service>

 

以上是以电话号和日期命名的录音文件,可以改成已联系人进行命名这样会方便查看文件。

最后别忘记加权限

 <uses-permission android:name="android.permission.RECORD_AUDIO"/> 
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>
  <uses-permission android:name="android.permission.MOUNT_UNMOUNT_FILESYSTEMS"/>


 

 


 

posted @ 2012-11-06 10:18  HappyCode002  阅读(237)  评论(0编辑  收藏  举报