Android通讯之通话功能的实现:

在Android中,android.telephony.TelephonyManager对象是开发者获取当前通话网络相关信息的窗口,通过TelephonyManager对象可以查看当前的通话状态,SIM卡的消息等相关内容:
// 获得TelephonyManager对象
TelephonyManager telManager = (TelephonyManager)getSystemService(Context.TELEPHONY_SERVICE);
// 获得通话网络类型信息
int phonyType = telManager.getCallState();
if(callstate == TelephonyManager.CALL_STATE_IDLE){
    ......//如果未在通话中,则处理相关事宜
}
......

此外,使用TelephonyManager.listen函数,可以注册android.telephony.PhoneStateListener对象来实时监听通话状态的变更情况,使得应用有机会对通话状态进行辅助处理。比如,利用PhoneStateListener对象可以监控来电信息,实时查询来电的归属地:
// 构造PhoneStateListener子类来处理相关事件
public class MyListener extends PhoneStateListener{
    public onCallStateChanged(int state,String incomingNumber){
    if(state == TelephonyManager.CALL_STATE_RINGING){
        ......//处理来电事件
    }
    }
}
......
// 打开监听电话状态的变更情况
TelephonyManager telManager = (TelephonyManager)getSystemService(Context.TELEPHONY_SERVICE);
telManager.listen(new MyListener(),PhoneStateListener.LISTEN_CALL_STATE);

处于安全性的考虑,Android并没有将拨号呼叫、接听电话等通话控制的接口暴露给开发者。如果在应用中需要打电话,则需要构造Intent对象调用通话应用来实现:
final Uri phone = Uri.parse("tel:1234567");
// 一种方式是调用拨号组件
startActivity(new Intent(Intent.ACTION_DIAL,phone));
//或者也可以直接拨号
startActivity(new Intent(Intent.ACTION_CALL,phone));

在Android中,通常会使用Intent.ACTION_DIAL构造Intent对象来发起拨号请求,以避免用户在不知情的情况下拨通而浪费通话费用。

例子:未接来电处理
实现思路 :
1、继承PhoneStateListener后,当手机的状态改变后将会触发onCallStateChanged。手机的状态分为CALL_STATE_RINGING(响铃中),CALL_STATE_IDLE(空闲),CALL_STATE_OFFHOOK(忙音)。
2、记录上一次的手机状态,如果手机现在空闲,上次状态响铃的话,就可以判断是未接来电。

实现步骤:
1、编写CallListener,处理手机状态变更监听,当状态改变时进行处理。
    public class CallListener extends PhoneStateListener {
        private static int lastetState = TelephonyManager.CALL_STATE_IDLE; // 最后的状态
        private Context context;
        public CallListener(Context context) {
                super();
                this.context = context;
        }
        public void onCallStateChanged(int state, String incomingNumber) {
                Log.v(TAG, "CallListener call state changed : " + incomingNumber);
                String m = null;
                // 如果当前状态为空闲,上次状态为响铃中的话,则破觚为认为是未接来电
                if(lastetState == TelephonyManager.CALL_STATE_RINGING && state == TelephonyManager.CALL_STATE_IDLE){
                        sendSmgWhenMissedCall(incomingNumber);
                }
                lastetState = state;// 最后的时候改变当前值
        }
        private void sendSmgWhenMissedCall(String incomingNumber) {
             // ... 进行未接来电处理(发短信、发email等等通知)
        }
    }

2、编写CallReceiver,注册来电广播接收器。
    public class CallReceiver extends BroadcastReceiver{
        public void onReceive(Context context, Intent intent) {
            Log.i("sms", "CallReceiver Start...");
            TelephonyManager telephony = (TelephonyManager) context.getSystemService(Context.TELEPHONY_SERVICE);
            CallListener customPhoneListener = new CallListener(context);
            telephony.listen(customPhoneListener,PhoneStateListener.LISTEN_CALL_STATE);
            Bundle bundle = intent.getExtras();
            String phoneNr = bundle.getString("incoming_number");
            Log.i("sms", "CallReceiver Phone Number : " + phoneNr);
        }
    }

3、在AndroidManifest.xml中的application节点下添加如下代码,进行注册电话状态改变广播接收.
<manifest ...>
  <application ...>
    <receiver android:name=".call.service.CallReceiver">
            <intent-filter android:priority="100">
                    <action android:name="android.intent.action.PHONE_STATE" />
            </intent-filter>
    </receiver>
  </application>
</manifest>

4、在AndroidManifest.xml中添加读取手机状态的权限.
<uses-permission android:name="android.permission.READ_PHONE_STATE" />
<uses-permission android:name="android.permission.CALL_PHONE"/>

示例代码下载链接:http://www.apkbus.com/android-137388-1-1.html

参考文章链接:

Android通讯:通话的更多相关文章

  1. Android通讯:短信

    Android通讯之短信功能实现: 使用android.telephony.SmsManager对象,可以发送短信和彩信.// 构造回调函数,短信发送结束后,会发出对应的Intent请求Intent ...

  2. android 获取通话记录

    在manifest添加以下权限<uses-permission android:name="android.permission.READ_CALL_LOG" />&l ...

  3. Android通讯-webSocket

    概述 上一篇简单的认识了Socket以及他的使用,在学习过程中看到了WebSocket的身影,于是乎百度了一把,这货也可以做全双工的网络通讯,而且是html5提出来的新东西!程序员嘛!就是要对新的东西 ...

  4. android中通话录音

    file = new File(Environment.getExternalStorageDirectory(), this.incomeNumber + System.currentTimeMil ...

  5. android 通讯类资料整理

    https://github.com/koush/AndroidAsync(websocket) https://github.com/loopj/android-async-http http:// ...

  6. Android笔记之adb命令应用实例1(手机端与PC端socket通讯下)

    通过adb和Android通讯需要引用adb相关的组件到项目中,分别为:adb.exe,AdbWinApi.dll,AdbWinUsbApi.dll. 可以在XXX\sdk\platform-tool ...

  7. Android核心分析之十九电话系统之GSMCallTacker

    GSMCallTracker在本质上是一个Handler.<IGNORE_JS_OP> 1.jpg (1.52 KB, 下载次数: 1) 下载附件  保存到相册 2012-3-22 11: ...

  8. Android-读取操作系统通话记录并/拨打电话/发送短信/复制号码到拨号盘

    apps目录的contacts应用(有读取通话记录功能),是访问provider目录的provider.contacts应用(有暴露通话记录),所以要阅读Android操作系统源码-->pack ...

  9. unity3d各平台通讯原生的平台API的说明

    注意:unity3d与原生代码的调用需要pro版本,此点注意了. 一.IOS平台,由于IOS平台的原生应该是objectC,所以通讯起来非常的简单, 1.原生代码调用u3d代码: 1.1.在Xcode ...

随机推荐

  1. Java: md5 加密中文 & 注意编码

    今天使用java的md5加密一个字符串(含有部分中文),遇到问题,百思不得其解. 后面网上搜索了一下,才知道是[编码]的问题. 以前在asp中用md5加密的时候,了解 gb2312和utf-8编码下, ...

  2. Windows 服务程序、窗口界面、桌面交互、与远程桌面

    昨天用c写了一个windows服务(服务内部带一个gui窗口+系统托盘),在windows xp sp3上测试,启动服务后,系统托盘显示正常. 但在另一台windows 2003 sp2 上测试(通过 ...

  3. Hashtable 删除元素, 抛出异常 java.util.ConcurrentModificationException

    今天在对一个Hashtable对象进行 搜索 -> 删除 操作时遇到的一个问题,开始的使用我使用的是Hashtable的Iterator,然后直接执行: Hashtable.remove(key ...

  4. django中命令行调试程序

    (1)进入到程序manage.py所在的目录下 (2)python manage.py shell 这样可在命令行中引入models.views.class等所有的包,然后进行命令行试运行.

  5. 怎样解决Myeclipse内存溢出?

    打开myeclipse 10安装目录下的myeclipse.ini文件 打开文件,将文件圈圈中的内容设置如下图: 上面是其中一种解决方案,下面介绍第二种解决方案 设置Default VM Argume ...

  6. 数据正规化 (data normalization) 的原理及实现 (Python sklearn)

    原理 数据正规化(data normalization)是将数据的每个样本(向量)变换为单位范数的向量,各样本之间是相互独立的.其实际上,是对向量中的每个分量值除以正规化因子.常用的正规化因子有 L1 ...

  7. saltstack 常用模块

    cp模块 功能:实现远程文件.目录的复制,以及下载URL文件等操作 使用cp模块配置管理之前,要首先指定saltstack所有状态文件的根目录,在master上做如下操作: 指定根目录(确定指定的目录 ...

  8. 函数和常用模块【day05】:装饰器前戏(二)

    本节内容 嵌套函数 局部作用域和全局作用域的访问顺序 一.嵌套函数 1.定义 在一个函数的函数体内,用def 去声明一个函数,而不是去调用其他函数,称为嵌套函数. 1 2 3 4 5 6 7 8 9 ...

  9. Hbase记录-Hbase其他工具

    1.RowCounter工具可以查看某张表有多少行,效率非常高 2.count命令在数据量大的时候效率非常差 执行./hbase  org.apache.hadoop.habse.mapreduce. ...

  10. JAVA锁的优化和膨胀过程

    转自:https://www.cnblogs.com/dsj2016/p/5714921.html https://cloud.tencent.com/developer/article/103675 ...