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. A1070. Mooncake

    Mooncake is a Chinese bakery product traditionally eaten during the Mid-Autumn Festival. Many types ...

  2. share.js一键分享到微博、QQ空间、QQ好友、微信、腾讯微博、豆瓣、Facebook、Twitter、Linkedin、Google+、点点等

    官网上面 https://github.com/overtrue/share.js非常详细的介绍了share.js他的使用 使用方式有:第一:使用 npm npm install social-sha ...

  3. 增加swap分区,文件形式

    查看swap a: sudo swapon -s b: free -m 文件方式: 1. 生成 生成一个1Gb(bs*count)的文件 [root@localhost ~]# dd if=/dev/ ...

  4. Redis 安全配置

    1.禁止一些高危命令 修改 redis.conf 文件,添加 rename-command FLUSHALL "" rename-command FLUSHDB "&qu ...

  5. python---ORM之SQLAlchemy(2)外键使用

    import sqlalchemy from sqlalchemy import create_engine from sqlalchemy import Column,String,Integer, ...

  6. webpack配置说明

    webpack是一个现代JavaScript应用程序的静态模块打包器. 它有几个核心概念: 一.entry(入口) 指示webpack应该使用哪个模块,来作为构建其内部依赖图的开始, 可以在webpa ...

  7. JS基础:翻转数组

    var arr = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]; console.log(arr); //操作原数组,让原数组第一位和最后一个位调换位置,以此类推. for (va ...

  8. AbstractQueuedSynchronizer同步队列与Condition等待队列协同机制

    概要: AQS维护了一个同步队列 Condition是JUC的一个接口,AQS的ConditionObject实现了这个接口,维护了一个等待队列(等待signal信号的队列) 线程调用reentran ...

  9. HDU - 4389 X mod f(x)(数位dp)

    http://acm.hdu.edu.cn/showproblem.php?pid=4389 题意 为[A,B] 区间内的数能刚好被其位数和整除的数有多少个. 分析 典型的数位dp...比赛时想不出状 ...

  10. Codeforces 950 D. A Leapfrog in the Array

    http://codeforces.com/contest/950/problem/D 前n/2个格子的奇数下标的数没有参与移动 候n/2个格子的奇数下标的数一定是一路移向偶数下标移 所以还原数的初始 ...