通过服务监控手机呼叫状态并进行录音
两个服务互相守护
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" android:layout_height="match_parent" android:orientation="vertical" tools:context=".MainActivity" > <Button android:onClick="start" android:layout_width="fill_parent" android:layout_height="wrap_content" android:text="开始监听" /> <Button android:onClick="stop" android:layout_width="fill_parent" android:layout_height="wrap_content" android:text="停止监听" /> </LinearLayout>开启服务和停止服务
package com.itheima.phonelistener; import android.app.Activity; import android.content.Intent; import android.os.Bundle; import android.view.View; public class MainActivity extends Activity { @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); } public void start(View view){ //开启服务。 Intent intent = new Intent(this,SystemService.class); startService(intent); } public void stop(View view){ //停止服务。 Intent intent = new Intent(this,SystemService.class); stopService(intent); } }
电话管理器 TelephonyManager,可以注册一个监听器,监听一个特定电话的状态
录音机 MediaRecorder
权限:
<uses-permission android:name="android.permission.READ_PHONE_STATE" /> <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" /> <uses-permission android:name="android.permission.RECORD_AUDIO" />
配置服务:
<service android:name="com.itheima.phonelistener.SystemService" > </service> <service android:name="com.itheima.phonelistener.SystemService2" > </service>
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.os.Environment; import android.os.IBinder; import android.telephony.PhoneStateListener; import android.telephony.TelephonyManager; public class SystemService extends Service { // 电话管理器 private TelephonyManager tm; // 监听器对象 private MyListener listener; //声明录音机 private MediaRecorder mediaRecorder; @Override public IBinder onBind(Intent intent) { return null; } // 服务创建的时候调用的方法 @Override public void onCreate() { // 后台监听电话的呼叫状态。 // 得到电话管理器的引用 tm = (TelephonyManager) this.getSystemService(TELEPHONY_SERVICE); listener = new MyListener(); //注册一个监听器,监听一个特定电话的状态 //1监听器 2监听事件 tm.listen(listener, PhoneStateListener.LISTEN_CALL_STATE); super.onCreate(); } private class MyListener extends PhoneStateListener { //空闲状态是0 响铃状态是1 接通状态是2 // 当电话的呼叫状态发生变化的时候调用的方法 @Override public void onCallStateChanged(int state, String incomingNumber) { super.onCallStateChanged(state, incomingNumber); try { switch (state) { case TelephonyManager.CALL_STATE_IDLE://空闲状态。 if(mediaRecorder!=null){ //8.停止捕获 mediaRecorder.stop(); //9.释放相关的资源 mediaRecorder.release(); //对象置为空 mediaRecorder = null; System.out.println("录制完毕,上传文件到服务器。"); } break; case TelephonyManager.CALL_STATE_RINGING://零响状态。 break; case TelephonyManager.CALL_STATE_OFFHOOK://通话状态 //开始录音 //1.实例化一个录音机 mediaRecorder = new MediaRecorder(); //2.指定录音机的声音源 MIC是麦克风的意思,但只能录自己,VOICE_CALL是两边都能录,但是有的手机不能录 //索尼 中兴这些国产机就能录 //htc 欧洲 美国等andorid手机就不行,当地法律规定,录声音需要征求对方同意,所以这个参数出厂的时候就被取消掉了 mediaRecorder.setAudioSource(MediaRecorder.AudioSource.MIC); //3.设置录制的文件输出的格式 mediaRecorder.setOutputFormat(MediaRecorder.OutputFormat.DEFAULT);//默认的文件格式 //4.指定录音文件的名称 File file = new File(Environment.getExternalStorageDirectory(),System.currentTimeMillis()+".3gp"); mediaRecorder.setOutputFile(file.getAbsolutePath()); //5.设置音频的编码 mediaRecorder.setAudioEncoder(MediaRecorder.AudioEncoder.DEFAULT); //6.准备开始录音 mediaRecorder.prepare(); //7.开始录音 mediaRecorder.start(); break; } } catch (Exception e) { e.printStackTrace(); } } } // 服务销毁的时候调用的方法 @Override public void onDestroy() { super.onDestroy(); // 取消电话的监听 System.out.println("ondestory"); Intent i = new Intent(this,SystemService2.class); startService(i); //LISTEN_NONE不监听,就是取消监听 tm.listen(listener, PhoneStateListener.LISTEN_NONE); listener = null; } }
配置广播接受者,一旦手机开机就自动启动监听服务
权限:<uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED" />
配置广播接受者:
<receiver android:name="com.itheima.phonelistener.BootReceiver" > <intent-filter> <action android:name="android.intent.action.BOOT_COMPLETED" /> <!-- 开机启动 触发服务--> </intent-filter> </receiver>
package com.itheima.phonelistener; import android.content.BroadcastReceiver; import android.content.Context; import android.content.Intent; public class BootReceiver extends BroadcastReceiver { //广播接收者,一旦手机开机就启动监听服务 @Override public void onReceive(Context context, Intent intent) { Intent i = new Intent(context,SystemService.class); context.startService(i); } }
郑重声明:本站内容如果来自互联网及其他传播媒体,其版权均属原媒体及文章作者所有。转载目的在于传递更多信息及用于网络分享,并不代表本站赞同其观点和对其真实性负责,也不构成任何其他建议。