- 浏览: 2966276 次
- 性别:
- 来自: 上海
文章分类
- 全部博客 (893)
- android (110)
- iphone (198)
- java (79)
- JavaScript手册-目录 (9)
- JavaScript手册-Array (19)
- JavaScript手册-Boolean (5)
- JavaScript手册-Date (50)
- JavaScript手册-Math (30)
- JavaScript手册-Number (14)
- JavaScript手册-RegExp (7)
- JavaScript手册-String (38)
- JavaScript手册-全局函数 (8)
- JavaScript实用脚本 (7)
- Others (21)
- java-jpcap (7)
- java-thread (1)
- ibm文章 (3)
- classloader (2)
- java-filter (2)
- 运行环境 (33)
- java-正则 (2)
- oracle (1)
- linux-shell (26)
- wap (1)
- sqlite (3)
- wow (1)
- jvm (1)
- git (5)
- unity3d (29)
- iap (2)
- mysql (23)
- nginx (14)
- tomcat (9)
- apache (2)
- php (1)
- ubuntu (40)
- rsa (1)
- golang (21)
- appstore (5)
- sftp (2)
- log4j (2)
- netty (18)
- 测试工具 (6)
- memcache (5)
- 设计模式 (1)
- centos (8)
- google_iab (5)
- iOS专题 (4)
- mac (10)
- 安装配置帮助手册 (2)
- im4java_graphicsmagick (5)
- inotify-tools (1)
- erlang (6)
- 微信支付 (1)
- redis (8)
- RabbitMQ (5)
最新评论
-
heng123:
Netty视频教程https://www.douban.com ...
netty4.0.23 初学的demo -
maotou1988:
使用Netty进行Android与Server端通信实现文字发 ...
netty4.0.23 初学的demo -
码革裹尸:
非常感谢,正好用上
android 呼入电话的监听(来电监听) -
rigou:
提示的/222.177.4.242 无法链接到ip地址,是什 ...
通过 itms:services://? 在线安装ipa ,跨过app-store -
duwanbo:
GridView与数据绑定
[Android实例]通话接通后震动提示
转载自 http://blog.csdn.net/tyfjy/article/details/6452126
今天介绍一下在Android 中实现通话接通后震动提示, 这里通话主要是针对拨出的电话. 想要在接通的时候给出震动提示那么我们就需要知道通话何时是被接通的. 这样才能在进入该状态后给出提示. 但SDK 中并没有直接获得这种状态的方式. 首先我们看一下SDK 中电话服务类为我们提供了哪些通话状态.
SDK 中的TelephonyManager 类提供了3 种电话的状态.
CALL_STATE_IDLE 空闲状态
CALL_STATE_OFFHOOK 摘机状态
CALL_STATE_RINGING 响铃状态
这几个状态很容易理解, 其中摘机状态即拿起话筒( 对于座机电话而言的动作), 但这个状态可能发生在拨入电话接通时, 也可能是拨出电话时. 但是却不能说明拨出电话接通时. 通过以上3 种状态我们仅能组合出: 挂机, 来电接通. 这两个状态. 而今天我们要实现的功能却无法做到.
看来我们需要寻找其他方法来实现了,SDK 靠不住啊……
还好Android 在运行时会有大量的log 产生, 看看我们能不能从这上面找到突波口呢. 我们选择Android 的Radio 模块的日志来分析. 首先我们需要写一段代码来读取Radio 相关的log. 读取log 就不得不用到logcat 了.
Process process; InputStream inputstream; BufferedReader bufferedreader; try { process = Runtime.getRuntime().exec("logcat -v time -b radio"); inputstream = process.getInputStream(); InputStreamReader inputstreamreader = new InputStreamReader( inputstream); bufferedreader = new BufferedReader(inputstreamreader); String str = ""; while ((str = bufferedreader.readLine()) != null) { log.i("mLogcat",str); } } catch (Exception e) { }
另外,要让程序能够读取系统log需要指定权限,在AndroidManifest.xml文件中加入一下内容.
<uses-permission android:name="android.permission.READ_LOGS"></uses-permission>
通过上面这段代码我们就可以将Radio 的log 输出到了, 这样我们就可以通过在DDMS 中查看这些log, 分析其中的通话过程. 具体抓到的log 就不贴出来了. 大家可以自己编写程序通过上面的代码来抓取和分析. 我只说一下我的分析结果.
通过分析log 发现了一些蛛丝马迹. 其中有几条日志很有用.
GET_CURRENT_CALLS id=1,DIALING
GET_CURRENT_CALLS id=1,ALERTING
GET_CURRENT_CALLS id=1,ACTIVE
由于log 较长我只拿了每条log 的开头部分, 真实的会多很多内容. 当我们拨出电话的时候, 会输入这么几条log.
拨号-> 提醒-> 活动.
大致是这么个过程. 经过几次测试发现, 电话接通时会进入活动状态, 并会输出:GET_CURRENT_CALLS id=1,ACTIVE 这条log, 至此我们已经接近成功了.
不过之后我又发现在拨号开始到电话接通这段时间内会经过多次的
拨号-> 提醒-> 活动, 这样的状态变化, 仅当话筒中嘟声响起后GET_CURRENT_CALLS 这条日志会锁定在ALERTING. 在电话接通前便不再出现
GET_CURRENT_CALLS 日志了.
可能上面的这段表述大家不是很清楚, 换句话说在通话接通之前会出现多次的
GET_CURRENT_CALLS ACTIVE 这样的日志, 而仅有一次是电话接通产生的. 这就给我们造成了麻烦. 不能只是单纯的抓取GET_CURRENT_CALLS ACTIVE 这样的信息来判断了.
我们只能通过一些逻辑上的判断来实现了.下面看我的代码.
class TestThread implements Runnable { //振动器 Vibrator mVibrator; //电话服务 TelephonyManager telManager; public TestThread(Vibrator mVibrator, TelephonyManager telManager) { this.mVibrator = mVibrator; this.telManager = telManager; } @Override public void run() { //获取当前话机状态 int callState = telManager.getCallState(); Log.i("TestService", "开始.........." + Thread.currentThread().getName()); //记录拨号开始时间 long threadStart = System.currentTimeMillis(); Process process; InputStream inputstream; BufferedReader bufferedreader; try { process = Runtime.getRuntime().exec("logcat -v time -b radio"); inputstream = process.getInputStream(); InputStreamReader inputstreamreader = new InputStreamReader( inputstream); bufferedreader = new BufferedReader(inputstreamreader); String str = ""; long dialingStart = 0; boolean enableVibrator = false; boolean isAlert = false; while ((str = bufferedreader.readLine()) != null) { //如果话机状态从摘机变为空闲,销毁线程 if (callState == TelephonyManager.CALL_STATE_OFFHOOK && telManager.getCallState() == TelephonyManager.CALL_STATE_IDLE) { break; } // 线程运行5分钟自动销毁 if (System.currentTimeMillis() - threadStart > 300000) { break; } Log.i("TestService", Thread.currentThread().getName() + ":" + str); // 记录GSM状态DIALING if (str.contains("GET_CURRENT_CALLS") && str.contains("DIALING")) { // 当DIALING开始并且已经经过ALERTING或者首次DIALING if (!isAlert || dialingStart == 0) { //记录DIALING状态产生时间 dialingStart = System.currentTimeMillis(); isAlert = false; } continue; } if (str.contains("GET_CURRENT_CALLS") && str.contains("ALERTING")&&!enableVibrator) { long temp = System.currentTimeMillis() - dialingStart; isAlert = true; //这个是关键,当第一次DIALING状态的时间,与当前的ALERTING间隔时间在1.5秒以上并且在20秒以内的话 //那么认为下次的ACTIVE状态为通话接通. if (temp > 1500 && temp < 20000) { enableVibrator = true; Log.i("TestService", "间隔时间....." + temp + "....." + Thread.currentThread().getName()); } continue; } if (str.contains("GET_CURRENT_CALLS") && str.contains("ACTIVE") && enableVibrator) { mVibrator.vibrate(100); enableVibrator = false; break; } } Log.i("TestService", "结束.........." + Thread.currentThread().getName()); } catch (Exception e) { // TODO: handle exception } } }
我的这个方法比较牵强,是通过判断第一次DIALING与每一次ALERTING之间的间隔,当间隔大于1.5秒.那么认为已经进入了"嘟"声提示 的时候了,那么下一个ACTIVE将是电话接通.这个1.5秒是通过分析日志得出的.但是这种方法我始终觉得不太靠谱.如果大家有好的方法可以交流交流.
剩下的就是让这个线程在电话拨出时触发,并且常驻在电话中时候准备这就可以了.可以采用Service配合Receiver来实现.Service来实现常驻,Receiver来实现监听拨出电话.基本就可以完成,我们想要的功能了.
以上代码我都测试过99%有效,哈哈.这里面提到了一些Android的基础内容像logcat,Service,Receiver.这些如果大家不了解的话可以到网上搜一下.有很多写的很不错的文章介绍Android的基础内容.我这里就不一一介绍了.
希望我写的东西对大家有所帮助.OK,就到这里吧.
发表评论
-
Android Fragment 真正的完全解析(下)
2015-03-25 14:30 1086Android Fragment 真正 ... -
Android Fragment 真正的完全解析(上)
2015-03-25 10:14 878Android Fragment 真正的 ... -
Activity的生命周期方法
2015-03-25 09:54 550一:Activity的生命周期方法 Android ... -
Android在layout xml中使用include
2015-03-25 07:28 967在Android的layout样式定义中,可以使 ... -
一个支持圆角的快速ImageView:RoundedImageView
2015-03-07 09:50 11059一个支持圆角的快速ImageView:Rounded ... -
ImageView图片设置
2015-03-05 23:08 922显示任意图像,例如图标。ImageView类可以加载 ... -
ListActivity的onListItemClick不响应的解决办法
2015-03-04 17:57 1079ListActivity的onListItemClic ... -
ListView中有控件隐藏或显示造成的显示错误问题
2015-03-03 23:03 1819ListView中有控件隐藏或显示造成的显示错误问题 ... -
Android中Application类用法
2015-03-03 09:12 967Android中Application类用法 ... -
Android使用Application总结
2015-03-03 09:11 1172Android使用Application ... -
在android中运行java main方法
2015-02-27 10:38 968在android中运行java main方法 ... -
android BitmapFactory.Options
2015-02-19 21:01 992public Bitmap inBi ... -
android 基础demo例子
2015-02-16 21:06 807demoDatas.add(new DemoBe ... -
Android大图片裁剪终极解决方案
2015-02-15 17:08 2134Android大图片裁剪终 ... -
Android_照相机Camera_调用系统照相机返回data为空
2015-02-15 14:17 1265Android_照相机Camera_调用系统照相机返回 ... -
Android: 打印Bundle内容
2015-02-15 14:11 2927Android: 打印Bundle内容 有的时 ... -
android线程、UI、AsyncTask
2015-02-13 18:06 1253本文是转摘的,看过了觉得很好!所以转了过来!如果你想要 ... -
Fragment中ListView的使用
2015-02-06 23:01 2100Fragment中ListView的使用 直接 ... -
在安卓开发时用酷派手机无法打印出应用内的日志的解决方法
2014-12-11 20:39 1172在安卓开发时用酷派手机无法打印出应用内的日志的解决方法 ... -
查看安卓APK文件证书的方法
2014-12-04 10:05 949************************** ...
相关推荐
Android Studio实例源码,主要介绍常用app的代码
android[Android实例] Android 竖着的SeekBar[Android实例] Android 竖着的SeekBar[Android实例] Android 竖着的SeekBar[Android实例] Android 竖着的SeekBar[Android实例] Android 竖着的SeekBar[Android实例] ...
2.保证无毒 3.简单,方便,实用 4.实例可以自行改用 5.如有非法,本人无法律责任,由改动代码人负责! 6.需要更多本人作品,查找标签“朱建强” 7.请下载,杀毒后再使用!
android 视频通话 实例源码,采用网易云信sdk开发,开发环境idea.
android[Android实例] 面试题集[Android实例] 面试题集[Android实例] 面试题集[Android实例] 面试题集[Android实例] 面试题集[Android实例] 面试题集[Android实例] 面试题集[Android实例] 面试题集[Android实例] ...
android 实例源码 集合各种实例源码
Android通过webservice连接SqlServer实例(Android4.0可运行)从原博http://blog.csdn.net/zhyl8157121/article/details/8169172下载下来的demo,看了评论和其它文章后修改,解决了Android2.3以上StrictMode模式下不...
android通话时间统计器[实例,源代码]
Android 实例 源码 39个 肯定有你想要的那么一个
android通话时间统计器[实例,源代码].rar
Android 入Android 入门实例门实例Android 入门实例Android 入Android 入门实例Android 入门实例门实例
Android实例开发完全手册
Android实例helloworldAndroid实例helloworldAndroid实例helloworldAndroid实例helloworldAndroid实例helloworldAndroid实例helloworldAndroid实例helloworld
这里是【Android项目实例】android通话时间统计器资源,希望源码能对大家有所帮助!
Android创意实例详解书籍源码,分享一下Android创意实例详解书籍源码
精通ANDROID实例开发.part1 由于上传限制,此书籍采用分卷压缩,需要与 精通ANDROID实例开发.part2一起才能正常解压使用
android实例开发完全手册光盘源代码部分
基于Android调用OpenAI接口的ChatGPT实例基于Android调用OpenAI接口的ChatGPT实例 基于Android调用OpenAI接口的ChatGPT实例基于Android调用OpenAI接口的ChatGPT实例 基于Android调用OpenAI接口的ChatGPT实例基于...
android 实例,用于android 新手了解android,上课实例。
精通ANDROID实例开发