android 通话录音功能

清华大佬耗费三个月吐血整理的几百G的资源,免费分享!....>>>

一、监听服务

    package com.newland.teleinterface;  
      
    import java.io.File;  
    import java.io.IOException;  
    import java.lang.reflect.Method;  
    import java.util.Calendar;  
      
    import com.android.internal.telephony.ITelephony;  
      
    import android.content.Context;  
    import android.content.Intent;  
    import android.media.MediaRecorder;  
    import android.net.Uri;  
    import android.os.Environment;  
    import android.os.Handler;  
    import android.os.Message;  
    import android.telephony.PhoneStateListener;  
    import android.telephony.TelephonyManager;  
    import android.util.Log;  
    import android.widget.Toast;  
      
    /** 
     *  
     * @author JD 功能:打电话,录音,通话时间 
     *  
     */  
    public class TeleInterface {  
      
      private String TAG = "TeleInterface";  
      private Context activity;  
      private Handler handler;  
      private Calendar calendar;  
      private String teleStartTime;  
      private String teleEndTime;  
      private TelephonyManager telephonyManager;  
      public static int TELE_START_TIME = 5;  
      public static int TELE_END_TIME = 6;  
      
      public String getTeleStartTime() {  
        return teleStartTime;  
      }  
      
      public String getTeleEndTime() {  
        return teleEndTime;  
      }  
      
      /** 
       * 构造函数 
       *  
       * @param activity 
       * @param handler 自定义handler接收消息 msg.what 5:电话拨通时间 6:电话挂断时间 
       */  
      public TeleInterface(Context activity, Handler handler) {  
        this.activity = activity;  
        this.handler = handler;  
      }  
      
      /** 
       * 拨打电话 
       *  
       * @param phoneNum 需要拨打号码 
       */  
      public void Call(String phoneNum) {  
        if (phoneNum.length() != 0) {  
          Intent phoneIntent = new Intent("android.intent.action.CALL", Uri.parse("tel:" + phoneNum));  
          activity.startActivity(phoneIntent);  
        } else {  
          Toast.makeText(activity, "不能输入为空", Toast.LENGTH_LONG).show();  
        }  
      }  
      
      /** 
       * 来电监听注册 
       */  
      public void teleListen() {  
        telephonyManager = (TelephonyManager) activity.getSystemService(Context.TELEPHONY_SERVICE);// 注册监听器  
      
        telephonyManager.listen(new PhoneListener(), PhoneStateListener.LISTEN_CALL_STATE);// 监听电话状态  
      }  
      
      /** 
       * 挂断电话 
       *  
       * @throws Exception 
       */  
      public void endCall() throws Exception {  
        ITelephony iTelephony = PhoneUtils.getITelephony(telephonyManager);  
        iTelephony.endCall();// 自动挂断电话  
      }  
      
      
      private final class PhoneListener extends PhoneStateListener {  
        private String incomeNumber; // 来电号码  
        private MediaRecorder mediaRecorder;  
        private File root_file, file;  
      
        @Override  
        public void onCallStateChanged(int state, String incomingNumber) {  
          try {  
            switch (state) {  
              case TelephonyManager.CALL_STATE_RINGING: // 来电  
                this.incomeNumber = incomingNumber;  
                break;  
              case TelephonyManager.CALL_STATE_OFFHOOK: // 接通电话  
                calendar = Calendar.getInstance();  
                teleStartTime = calendar.getTime().toString();  
      
                String root_directory = Environment.getExternalStorageDirectory() + "/recorded_calls";  
                root_file = new File(root_directory);  
                if (!root_file.exists()) {  
                  root_file.mkdir();  
                }  
                if(this.incomeNumber==null){  
                    this.incomeNumber = "call";  
                }  
                String record_call =  
                    root_directory + "/" + this.incomeNumber + "_" + System.currentTimeMillis()  
                        + ".amr";  
                file = new File(record_call);  
                if (!file.exists()) {  
                  file.createNewFile();  
                }  
      
                mediaRecorder = new MediaRecorder();  
                mediaRecorder.setAudioSource(MediaRecorder.AudioSource.VOICE_CALL); // 获得声音数据源  
                mediaRecorder.setOutputFormat(MediaRecorder.OutputFormat.DEFAULT); // 格式输出  
                mediaRecorder.setAudioEncoder(MediaRecorder.AudioEncoder.DEFAULT);  
                mediaRecorder.setOutputFile(file.getAbsolutePath()); // 输出文件  
                mediaRecorder.prepare(); // 准备  
      
                mediaRecorder.start();  
      
                Log.d(TAG, "开始录音!");  
      
                Message msg_start = new Message();  
                msg_start.what = TELE_START_TIME;  
                msg_start.obj = teleStartTime;  
      
                Log.d(TAG, "StartTime=====" + teleStartTime);  
      
                handler.sendMessage(msg_start);  
                break;  
      
              case TelephonyManager.CALL_STATE_IDLE: // 挂掉电话  
                if (mediaRecorder != null) {  
                  mediaRecorder.stop();  
                  mediaRecorder.release();  
                  mediaRecorder = null;  
      
                  calendar = Calendar.getInstance();  
                  teleEndTime = calendar.getTime().toString();  
                  Message msg_end = new Message();  
                  msg_end.what = TELE_END_TIME;  
                  msg_end.obj = teleEndTime;  
      
                  Log.d(TAG, "EndTime=====" + teleEndTime);  
      
                  handler.sendMessage(msg_end);  
                }  
                Log.d(TAG, "结束录音!");  
                break;  
      
            }  
          } catch (IllegalStateException e) {  
            // TODO Auto-generated catch block  
            e.printStackTrace();  
          } catch (IOException e) {  
            // TODO Auto-generated catch block  
            e.printStackTrace();  
          }  
        }  
      }   
    }  

  1. 二、activity使用 
import android.app.Activity;  
import android.os.Bundle;  
import android.view.Menu;  
import android.view.View;  
import android.view.View.OnClickListener;  
import android.widget.Button;  
import android.widget.EditText;  
import android.widget.TextView;  
  
public class MainActivity extends Activity implements OnClickListener {  
  
  private TextView teleStartTime, teleEndTime;  
  private Button teleButton;  
  private TeleInterface teleInterface;  
  private TeleHandler teleHandler;  
  private EditText telNo;  
  
  @Override  
  protected void onCreate(Bundle savedInstanceState) {  
    super.onCreate(savedInstanceState);  
    setContentView(R.layout.activity_main);  
    initView();  
    teleHandler = new TeleHandler(this, teleStartTime, teleEndTime);  
    teleInterface = new TeleInterface(this, teleHandler);  
    teleInterface.teleListen();  
  }  
  
  
  private void initView() {  
    teleStartTime = (TextView) findViewById(R.id.teleStartTime);  
    teleEndTime = (TextView) findViewById(R.id.teleEndTime);  
    teleButton = (Button) findViewById(R.id.teleButton);  
    telNo = (EditText) findViewById(R.id.telno);  
    teleButton.setOnClickListener(this);  
  }  
  
  
  @Override  
  public boolean onCreateOptionsMenu(Menu menu) {  
    // Inflate the menu; this adds items to the action bar if it is present.  
    getMenuInflater().inflate(R.menu.main, menu);  
    return true;  
  }  
  
  
  @Override  
  public void onClick(View v) {  
    switch (v.getId()) {  
      case R.id.teleButton:  
            if(!telNo.getText().toString().trim().equals("")){  
                 teleInterface.Call(telNo.getText().toString().trim());  
            }else{  
                 teleInterface.Call("10010");  
            }  
             
              
            try {  
//              Thread.sleep(5000);  
//              teleInterface.sendDTMF("1".toCharArray()[0]);  
              teleInterface.endCall();  
            } catch (Exception e) {  
              // TODO Auto-generated catch block  
              e.printStackTrace();  
            }  
            break;  
  
      default:  
        break;  
    }  
  }  
  
}  

三、布局配置文件
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"  
    xmlns:tools="http://schemas.android.com/tools"  
    android:layout_width="fill_parent"  
    android:layout_height="wrap_content"  
    android:orientation="vertical"  
    tools:context=".MainActivity" >  
      
    <EditText   
        android:layout_width="fill_parent"  
        android:layout_height="wrap_content"  
        android:id="@+id/telno"  
        android:numeric="integer"  
        android:hint="电话号码"/>  
      
    <Button  
        android:id="@+id/teleButton"  
        android:layout_width="wrap_content"  
        android:layout_height="wrap_content"  
        android:text="拨号" />  
  
    <TextView  
        android:layout_width="wrap_content"  
        android:layout_height="wrap_content"  
        android:text="通话时间:" />  
  
    <TextView  
        android:id="@+id/teleStartTime"  
        android:layout_width="wrap_content"  
        android:layout_height="wrap_content" />  
  
    <TextView  
        android:layout_width="wrap_content"  
        android:layout_height="wrap_content"  
        android:text="结束时间:" />  
  
    <TextView  
        android:id="@+id/teleEndTime"  
        android:layout_width="wrap_content"  
        android:layout_height="wrap_content" />  
  
</LinearLayout>