Android通讯:通话
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通讯:通话的更多相关文章
- Android通讯:短信
Android通讯之短信功能实现: 使用android.telephony.SmsManager对象,可以发送短信和彩信.// 构造回调函数,短信发送结束后,会发出对应的Intent请求Intent ...
- android 获取通话记录
在manifest添加以下权限<uses-permission android:name="android.permission.READ_CALL_LOG" />&l ...
- Android通讯-webSocket
概述 上一篇简单的认识了Socket以及他的使用,在学习过程中看到了WebSocket的身影,于是乎百度了一把,这货也可以做全双工的网络通讯,而且是html5提出来的新东西!程序员嘛!就是要对新的东西 ...
- android中通话录音
file = new File(Environment.getExternalStorageDirectory(), this.incomeNumber + System.currentTimeMil ...
- android 通讯类资料整理
https://github.com/koush/AndroidAsync(websocket) https://github.com/loopj/android-async-http http:// ...
- Android笔记之adb命令应用实例1(手机端与PC端socket通讯下)
通过adb和Android通讯需要引用adb相关的组件到项目中,分别为:adb.exe,AdbWinApi.dll,AdbWinUsbApi.dll. 可以在XXX\sdk\platform-tool ...
- Android核心分析之十九电话系统之GSMCallTacker
GSMCallTracker在本质上是一个Handler.<IGNORE_JS_OP> 1.jpg (1.52 KB, 下载次数: 1) 下载附件 保存到相册 2012-3-22 11: ...
- Android-读取操作系统通话记录并/拨打电话/发送短信/复制号码到拨号盘
apps目录的contacts应用(有读取通话记录功能),是访问provider目录的provider.contacts应用(有暴露通话记录),所以要阅读Android操作系统源码-->pack ...
- unity3d各平台通讯原生的平台API的说明
注意:unity3d与原生代码的调用需要pro版本,此点注意了. 一.IOS平台,由于IOS平台的原生应该是objectC,所以通讯起来非常的简单, 1.原生代码调用u3d代码: 1.1.在Xcode ...
随机推荐
- A1070. Mooncake
Mooncake is a Chinese bakery product traditionally eaten during the Mid-Autumn Festival. Many types ...
- share.js一键分享到微博、QQ空间、QQ好友、微信、腾讯微博、豆瓣、Facebook、Twitter、Linkedin、Google+、点点等
官网上面 https://github.com/overtrue/share.js非常详细的介绍了share.js他的使用 使用方式有:第一:使用 npm npm install social-sha ...
- 增加swap分区,文件形式
查看swap a: sudo swapon -s b: free -m 文件方式: 1. 生成 生成一个1Gb(bs*count)的文件 [root@localhost ~]# dd if=/dev/ ...
- Redis 安全配置
1.禁止一些高危命令 修改 redis.conf 文件,添加 rename-command FLUSHALL "" rename-command FLUSHDB "&qu ...
- python---ORM之SQLAlchemy(2)外键使用
import sqlalchemy from sqlalchemy import create_engine from sqlalchemy import Column,String,Integer, ...
- webpack配置说明
webpack是一个现代JavaScript应用程序的静态模块打包器. 它有几个核心概念: 一.entry(入口) 指示webpack应该使用哪个模块,来作为构建其内部依赖图的开始, 可以在webpa ...
- JS基础:翻转数组
var arr = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]; console.log(arr); //操作原数组,让原数组第一位和最后一个位调换位置,以此类推. for (va ...
- AbstractQueuedSynchronizer同步队列与Condition等待队列协同机制
概要: AQS维护了一个同步队列 Condition是JUC的一个接口,AQS的ConditionObject实现了这个接口,维护了一个等待队列(等待signal信号的队列) 线程调用reentran ...
- HDU - 4389 X mod f(x)(数位dp)
http://acm.hdu.edu.cn/showproblem.php?pid=4389 题意 为[A,B] 区间内的数能刚好被其位数和整除的数有多少个. 分析 典型的数位dp...比赛时想不出状 ...
- Codeforces 950 D. A Leapfrog in the Array
http://codeforces.com/contest/950/problem/D 前n/2个格子的奇数下标的数没有参与移动 候n/2个格子的奇数下标的数一定是一路移向偶数下标移 所以还原数的初始 ...