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. vi怎么查找关键字

    进入vi的命令模式,具体操作:编辑模式下键入“:”,此时进入命令模式 在命令模式下键入“/”.

  2. poj 1904(强连通分量+完美匹配)

    传送门:Problem 1904 https://www.cnblogs.com/violet-acmer/p/9739990.html 参考资料: [1]:http://www.cnblogs.co ...

  3. linux 一些命令(2)

    1.查看centos版本 # lsb_release -a 2.查找大于1000M的文件 find / -type f -size +1000M -print0 | xargs -0 du –h

  4. C# 线程手册 第三章 使用线程 实现一个数据库连接池(实战篇)

    在企业级软件开发过程中,为了改善应用程序的性能需要通常使用对象池来控制对象的实例化.例如,在我们每次需要连接一个数据库时都需要创建一个数据库连接,而数据库连接是非常昂贵的对象.所以,为了节省为每次数据 ...

  5. JS基本包装类型之三(String)

    1. 基本数据类型和基本包装类型 这里以字符串类型来讲解基本数据类型和基本包装类型. JS中存在基本数据类型String(typeof返回"string"), 也存在基本包装数据类 ...

  6. 化工pdf下载

    Python爬虫视频教程零基础小白到scrapy爬虫高手-轻松入门 https://item.taobao.com/item.htm?spm=a1z38n.10677092.0.0.482434a6E ...

  7. jenkins+gitlab webhooks 实现自动触发打包

    说明:实现代码在gitlab上的提交后立马自动进行jenkins的job构建 安装插件: Gitlab Hook Plugin  Build Authorization Token Root Plug ...

  8. Python基础【day03】:字典(一)

    本节内容 简述 语法 字典的使用 字典内置方法 一.简述 字典是Python中的又一种数据结构,它是通过key-value的数据类型,跟我们小时候用的新华字典差不多,通过key去访问value 二.语 ...

  9. Log4net(一)-——配置文件

    一.Log4Net框架介绍 Log4net 是 Apache 下一个开放源码的项目,它是Log4j 的一个克隆版.Log4net中定义了多种日志信息输出模式.它可以根据需要将日志输出到控制台,文本文件 ...

  10. Study 7 —— while循环中止语句

    循环的终止语句break #用于完全结束一个循环,跳出循环体执行循环后面的语句continue #只终止本次循环,接着执行后面的循环 1. 打印0-100,截止到第6次 count = 0 while ...