您的位置:首页 > 移动开发 > Android开发

Android之电话监听(利用服务实现)

2011-12-27 16:50 423 查看
1. 启动模拟器,部署应用

2. 利用模拟器控制器发送短信启动服务(查看日志输出判断是否成功)

3. 向模拟器拨打电话,并接听,挂断电话后,利用文件管理查看对应的cache目录或者sdcard中生成了3gp文件,并将其复制到pc中播放以验证。

清单设置(一个receiver,一个service,若干权限)

<uses-permission android:name="android.permission.READ_PHONE_STATE"/>

<uses-permission android:name="android.permission.RECORD_AUDIO"/>

<uses-permission android:name=

"android.permission.MOUNT_UNMOUNT_FILESYSTEMS"/>

<uses-permission android:name=

"android.permission.WRITE_EXTERNAL_STORAGE"/>

<uses-permission android:name="android.permission.RECEIVE_SMS"/>

…

<application …>

<receiver android:name="BootBroadcastReceiver">

<intent-filter>

<action android:name=

"android.provider.Telephony.SMS_RECEIVED"/>

</intent-filter>

</receiver>

<service android:name="PhoneListenerService" />


电话监听器服务类:PhoneListenerService

package cn.class3g.phonelistener;

...

public class PhoneListenerService extends Service {

public IBinder onBind(Intent arg0) {

return null;

}

public void onCreate() {

super.onCreate();

Log.i("TAG", "服务启动了");

// 对电话的来电状态进行监听

TelephonyManager telManager = (TelephonyManager) this

.getSystemService(Context.TELEPHONY_SERVICE);

// 注册一个监听器对电话状态进行监听

telManager.listen(new MyPhoneStateListener(),

PhoneStateListener.LISTEN_CALL_STATE);

}

private class MyPhoneStateListener extends PhoneStateListener {

MediaRecorder recorder;

File audioFile;

String phoneNumber;

public void onCallStateChanged(int state, String incomingNumber) {

switch (state) {

case TelephonyManager.CALL_STATE_IDLE: /* 无任何状态时 */

if (recorder != null) {

recorder.stop();// 停止刻录

recorder.reset();// 重设

recorder.release();// 刻录完成一定要释放资源

}

break;

case TelephonyManager.CALL_STATE_OFFHOOK: /* 接起电话时 */

try {

recorder = new MediaRecorder();

recorder.setAudioSource(MediaRecorder.AudioSource.MIC); // 设置音频采集原

recorder.setOutputFormat(MediaRecorder.OutputFormat.THREE_GPP);// 内容输出格式

recorder.setAudioEncoder(MediaRecorder.AudioEncoder.AMR_NB); // 音频编码方式

// recorder.setOutputFile("/sdcard/myvoice.amr");

audioFile = new File(

Environment.getExternalStorageDirectory(),

phoneNumber + "_" + System.currentTimeMillis()

+ ".3gp");

recorder.setOutputFile(audioFile.getAbsolutePath());

Log.i("TAG", audioFile.getAbsolutePath());

recorder.prepare(); // 预期准备

recorder.start();

} catch (IllegalStateException e) {

e.printStackTrace();

} catch (IOException e) {

e.printStackTrace();

}

break;

case TelephonyManager.CALL_STATE_RINGING: /* 电话进来时 */

phoneNumber = incomingNumber;

break;

default:

break;

}

super.onCallStateChanged(state, incomingNumber);

}

}

}


利用开机启动广播启动服务(实验环境中为了方便起见可以先改用短消息广播)

开机启动完成广播action

<action android:name="android.intent.action.BOOT_COMPLETED"/>

package cn.class3g.phonelistener;

...

public class BootBroadcastReceiver extends BroadcastReceiver {

public void onReceive(Context context, Intent intent) {

Log.i("TAG", "广播被接收了");

Intent serviceIntent = new Intent(context, PhoneListenerService.class);

context.startService(serviceIntent);

}

}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: