Android编程之利用服务实现电话监听的方法

本文实例讲述了Android编程之利用服务实现电话监听的方法。分享给大家供大家参考,具体如下:

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);
 }
}

希望本文所述对大家Android程序设计有所帮助。

(0)

相关推荐

  • 解析android截屏问题

    我是基于android2.3.3系统之上的,想必大家应该知道在android源码下面有个文件叫做screencap吧,位于frameworks\base\services\surfaceflinger\tests\screencap\screencap.cpp,你直接在linux下编译(保存在 /system/bin/test-screencap),然后push到手机上再通过电脑去敲命令test-screencap /mnt/sdcard/scapxx.png就可以实现截屏. 复制代码 代码如下

  • Android 使用Shell脚本截屏并自动传到电脑上

    Android设备用久了,截屏是个麻烦事.更麻烦的是通过qq传到电脑上,倒腾半天.其实用adb命令就可以截屏,然后写个pull的语句就可以拉到电脑上了.文件名为capture.sh, 内容如下: #! /bin/bash adb shell screencap -p /sdcard/test.png #adb pull /sdcard/test.png ~/Desktop/test.png dir=~/Desktop/ curr=`date "+%Y-%m-%d %H:%M:%S"`

  • Android实现加载广告图片和倒计时的开屏布局

    这是一个android开屏布局的实例,可以用于加载广告图片和倒计时的布局.程序中设置的LayoutParams,划分额外空间比例为6分之5,具体权重比例可根据用户自己需求来自定义,异步加载广告图片,相关的Android代码. 具体实现代码如下: package cn.waps.extend; import android.app.Activity; import android.content.Context; import android.content.res.Configuration;

  • Android 屏幕截屏方法汇总

    1.直接使用getWindow().getDecorView().getRootView() 直接使用getWindow().getDecorView().getRootView()是获取当前屏幕的activity.然而对于系统状态栏的信息是截不了,出现一条空白的.如下图: 主要到没,有一条白色边就是系统状态栏.看一下代码,很简单都加了注释了. //这种方法状态栏是空白,显示不了状态栏的信息 private void saveCurrentImage() { //获取当前屏幕的大小 int wi

  • Android监听home键的方法详解

    本文实例分析了Android监听home键的方法.分享给大家供大家参考,具体如下: 如何知道Home按钮被点击了呢?做launcher的时候,看源代码发现原因 如果你的Activity具备这些属性 <activity android:name="com.woyou.activity.HomeActivity" android:launchMode="singleInstance" > <intent-filter> <action an

  • Android截屏保存png图片的实例代码

    复制代码 代码如下: import java.io.FileNotFoundException;import java.io.FileOutputStream;import java.io.IOException; import android.app.Activity;import android.graphics.Bitmap;import android.graphics.Rect;import android.util.Log;import android.view.View; publ

  • 设置Android系统永不锁屏永不休眠的方法

    在进行Android系统开发的时候,有些特定的情况需要设置系统永不锁屏,永不休眠.本篇文章给大家介绍Android 永不锁屏,开机不锁屏,删除设置中休眠时间选项,需要的朋友一起学习吧. Android 6.0.1 Create:2016-02-29 1.Settings 删掉屏幕待机选项 packages/apps/Settings/res/xml/display_settings.xml <!-- Hide screen sleep <ListPreference android:key=&

  • android监听返回按钮事件的方法

    本文实例讲述了android监听返回按钮事件的方法.分享给大家供大家参考.具体如下: 用户在点击手机的返回按钮时,默认是推出当前的activty,但是有时用户不小心按到返回,所以需要给用户一个提示,这就需要重写onkeydown事件,实现的效果如下: java代码如下: @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.l

  • android禁止锁屏保持常亮(示例代码)

    在播放video的时候在mediaplayer mMediaPlayer.setScreenOnWhilePlaying(true); 已经设置了,在原生的android没有问题和在defy上也没有问题,一到三星的galaxy上就有问题,不知道三星他们改了哪些地方.一般的话设置了播放视频屏幕没有自动.但是在三星上就出了问题. 只好再找找.一般的话设置有两种方法. 如下: 复制代码 代码如下: 1. getWindow().addFlags(WindowManager.LayoutParams.F

  • Android唤醒、解锁屏幕代码实例

    解锁.唤醒屏幕用到KeyguardManager,KeyguardLock,PowerManager,PowerManager.WakeLock   所需权限: 复制代码 代码如下: <uses-permission android:name="android.permission.WAKE_LOCK" /> <uses-permission android:name="android.permission.DISABLE_KEYGUARD" /&

  • Android 监听锁屏、解锁、开屏 功能代码

    1.首先定义 ScreenListener package com.app.lib; import android.content.BroadcastReceiver; import android.content.Context; import android.content.Intent; import android.content.IntentFilter; import android.os.PowerManager; /** * Created by ${zyj} on 2016/6

  • 使用python编写android截屏脚本双击运行即可

    测试的过程中经常需要截取屏幕,通常的做法是使用手机自带的截屏功能,然后将截屏文件复制出来,这种方法的优点是不需要连接数据线就可截屏,缺点则是生成的截屏文件命名是随机命名的,复制出来也比较麻烦.另一种方法是使用PC端的手机助手类软件. 这里使用python编写一个截屏的脚本,双击运行脚本就OK,截屏成功后会将截屏文件已当前时间命名,并保存在存放脚本的当前路径的screenshot文件夹下: #!/usr/bin/env python import os import time PATH = lam

  • Android编程实现监听EditText变化的方法

    本文实例讲述了Android编程实现监听EditText变化的方法.分享给大家供大家参考,具体如下: 监听EditText中的内容的变化.在EditText没有找到一个setOnxxxx的方法.百度了一下,原来在EditText中有一个方法addTextChangedListner(TextWatcher watcher)方法,用他可以时时监听EditText的内容变化.TextWatcher是一个接口类,所以必须实现TextWatcher里的抽象方法: 当EditText里面的内容有变化的时候

  • Android4.0.x Home键事件拦截监听的方法

    本文实例讲述了Android4.0.x Home键事件拦截监听的方法.分享给大家供大家参考,具体如下: 在2.3.x 的主要做法如下,具体实现网上有很多文章 @Override public void onAttachedToWindow() { this.getWindow().setType(WindowManager.LayoutParams.TYPE_KEYGUARD); super.onAttachedToWindow(); } 代码移植到4.0.1后 this.getWindow()

随机推荐