android应用开发全程实录-实现甩动拨打和挂断电话
今天继续给大家带来《Android应用开发全程实录》中的章节,这部分是讲传感器中的一个实例。
通过上面的例子我们学会了如何获得某种类型的传感器,下面通过一个实例来学习如何使用某一个类型的传感器。我们以加速传感器为例,来实现这样一个功能:摇动手机便自动拨打某亲情号码,并实现再次摇动则挂机的功能。
工程目录:EX_12_03
第一步,UI布局main.xml的代码如下,其运行效果如图12-10所示。
<?xml version="1.0" encoding="utf-8"?><LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:orientation="vertical" android:layout_width="fill_parent" android:layout_height="fill_parent" ><TextView android:layout_width="fill_parent" android:layout_height="wrap_content" android:text="当前状态:就绪" android:id="@+id/state" android:textColor="#ff0000" /><Button android:layout_width="fill_parent" android:layout_height="wrap_content" android:id="@+id/call" android:text="打电话(10086)"/> <Button android:layout_width="fill_parent" android:layout_height="wrap_content" android:id="@+id/stop" android:text="挂机"/> </LinearLayout>
第二步,挂电话需要用到系统的Itelephony类的支持,由于Google从Android 2.1 SDK版本后,屏蔽了com.android.internal.telephony. Itelephony类,因此,需要从Android源码下载,找到该类并导入到工程目录下,记得包名一致。
第三步,Activity类ShakeSensorActivity的实现。该类实现SensorListener接口,添加加速度侦听事件,通过判断设备X、Y、Z方向的总晃动值来判断是否启动打电话和挂机操作。以拨打10086测试为例,当设备总晃动值大于100作为一个测试判断点,如果当前没有在通话界面,就通过Intent启动拨打电话,否则就挂机操作。设备摇动时,启动电话、挂机的界面状态如图图12-11、图12-12所示。
▲图12-10 软件运行效果图 ▲图12-11 电话启动界面 图12-12 摇动设备挂机时的状态界面
下面就来看看代码:
public class ShakeSensorActivity extends Activity implements SensorListener {private float lastX;private float lastY;private float lastZ;private View mainView;private long currTime;private long lastTime;private long duration;// 持续时间 private float currShake;private float totalShake;private ITelephony iTelephony;private boolean isCalling = false; SensorManager sm = null; @Overridepublic void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState); mainView = LinearLayout.inflate(this, R.layout.main, null); setContentView(mainView); ((Button) mainView.findViewById(R.id.call)).setOnClickListener(new OnClickListener() { @Overridepublic void onClick(View v) {// 打电话 callPhoneNumber10086(); } }); ((Button) mainView.findViewById(R.id.stop)).setOnClickListener(new OnClick- Listener() { @Overridepublic void onClick(View v) {// 挂机 closePhone(); } });// 获取传感器管理器 sm = (SensorManager) getSystemService(Context.SENSOR_SERVICE);// 注册加速度传感器 sm.registerListener(this, SensorManager.SENSOR_ACCELEROMETER,SensorManager. SENSOR_DELAY_NORMAL); } @Overridepublic void finish() {// TODO Auto-generated method stub super.finish(); sm.unregisterListener(this);// 注销侦听 } @Overridepublic void onAccuracyChanged(int sensor, int accuracy) {// 精度改变,该方法实质上不做任何操作,它只在每次调用时,添加一个日志项 } @Overridepublic void onSensorChanged(int sensor, float[] values) {float x = values[0];float y = values[1];float z = values[2]; currTime = System.currentTimeMillis();if (lastX == 0 && lastY == 0 && lastZ == 0) {// 第一次shake lastTime = currTime; }if (currTime - lastTime > 200) {// 200毫秒检测一次 duration = currTime - lastTime; currShake = (Math.abs(x - lastX) + Math.abs(y - lastY) + Math.abs(z - lastZ))/ duration * 200; } totalShake = totalShake + currShake;if (totalShake > 100) { totalShake = 0;// 重置为0,重新累计计数 lastX = 0; lastY = 0; lastZ = 0; lastTime = 0; currTime = 0;if (!isCalling) { callPhoneNumber10086(); ((TextView) mainView.findViewById(R.id.state)).setText("当前状态: 通话中..."); } else { closePhone(); ((TextView) mainView.findViewById(R.id.state)).setText("当前状态:通话结束..."); } } lastX = x; lastY = y; lastZ = z; lastTime = currTime; } /** * tell 10086打开通话界面*/private synchronized void callPhoneNumber10086() { isCalling = true; Intent myIntentDial = new Intent(Intent.ACTION_CALL,Uri.parse("tel:" + 10086)); startActivity(myIntentDial); } /** * 结束通话*/private synchronized void closePhone() {try { getTelephony(); iTelephony.endCall(); isCalling = false; } catch (RemoteException e) {// TODO Auto-generated catch block e.printStackTrace(); } } /** * 初始电话 实例*/public void getTelephony() { TelephonyManager telMgr = (TelephonyManager) this.getSystemService(Service. TELEPHONY_SERVICE); Class<TelephonyManager> c = TelephonyManager.class; Method getITelephonyMethod = null;try { getITelephonyMethod = c.getDeclaredMethod("getITelephony",(Class[]) null); getITelephonyMethod.setAccessible(true); } catch (SecurityException e) { e.printStackTrace(); } catch (NoSuchMethodException e) { e.printStackTrace(); } try { iTelephony = (ITelephony) getITelephonyMethod.invoke(telMgr,(Object[])null); } catch (IllegalArgumentException e) { e.printStackTrace(); } catch (IllegalAccessException e) { e.printStackTrace(); } catch (InvocationTargetException e) { e.printStackTrace(); } }
通过getTelephony()方法,初始一个iTelephony实例,方便调用,目前只用到了挂机关闭通话,打电话也可以通过iTelephony.dial(“10086”)直接拨打。这样就轻松实现了用传感器实现甩动打、挂电话功能。
转载于:https://www.cnblogs.com/noTice520/archive/2011/12/27/2303492.html
android应用开发全程实录-实现甩动拨打和挂断电话相关推荐
- android应用开发全程实录-你有多熟悉listview? .
本文版权归 csdn noTice501 所有,转载请详细标明原作者及出处,以示尊重! 作者:noTice501 原文:http://blog.csdn.net/notice520/article/d ...
- android应用开发全程实录-你有多熟悉listview?
今天给大家带来<android应用开发全程实录>中关于listview和adatper中的部分.包括listview的基本使用,listview的优化等. 我们经常会在应用程序中使用列表的 ...
- android应用开发全程实录出版
这本书经历了大半年的时间,终于可以和读者见面了.书籍由我和微度网http://www.microdu.com/其他两位资深开发者共同完成. 最近经历了很多,应该是人生的一个转折点吧.总会有一些选择,将 ...
- android项目 用手机,基于Android平台的手机记账应用开发全程实录|Android项目手机记账应用...
<基于Android平台的手机记账应用开发全程实录> 百度云链接:http://pan.baidu.com/s/1dFFPWpr 密码: j435 01.项目概述与项目需求 02.数据库设 ...
- 基于Android平台的手机记账应用开发全程实录|Android项目手机记账应用
<基于Android平台的手机记账应用开发全程实录> 百度云链接:http://pan.baidu.com/s/1dFFPWpr 密码: j435 01.项目概述与项目需求 02.数据库设 ...
- 【原创】【推荐】《ASP.NET 3.5+SQL Server网站模块化开发全程实录》出版记
进过半年多的努力,<ASP.NET 3.5+SQL Server网站模块化开发全程实录>一书终于得以由清华大学出版社顺利出版. 第一次出版此类图书,不免其中会有诸多纰漏,还望广大读者不吝指 ...
- android 关闭蓝牙打电话功能,Android蓝牙开发【八】hfp接听、挂断电话
继续研究hfp相关功能.蓝牙耳机可以控制手机接听.拒接.挂断电话,拨打电话等功能.本文主要分析下起这些操作的大致流程. 在系统应用Bluetooth中com_android_bluetooth.cpp ...
- Android 蓝牙开发(八)hfp接听、挂断电话
转载请注明出处:http://blog.csdn.net/vnanyesheshou/article/details/71429860 本文已授权微信公众号 fanfan程序媛 独家发布 扫一扫文章底 ...
- android 自动挂断,android实现接通和挂断电话
本文实例为大家分享了android实现接通和挂断电话的具体代码,供大家参考,具体内容如下 关键代码:[PhoneUtils类] package com.ebupt.phonerecorddemo.se ...
最新文章
- matlab简单程序实例_visual basic VB.NET实例系列教程第一节(简单实用抽奖程序)...
- 【Spring】Spring学习笔记-01-入门级实例
- linux 删除文件_Linux删除文件夹命令有哪些
- 看不清的融资迷局 二线玩家字节跳动在打什么主意?
- 【渝粤题库】国家开放大学2021春1375Matlab语言及其应用题目
- 支付宝牵手全球最大公募基金 上线“帮你投” 800元起投
- go语言实现zip压缩与解压
- 将url参数转为json对象
- 自绘GroupBox控件
- MATLAB adf检验和kpss检验结果说明
- 语法练习——动名词专项训练
- HDU 3966 Aragorns Story
- VMware不支持虚拟化的Intel VT-X/EPT
- 逍遥模拟器怎样连接android,逍遥安卓模拟器
- 07 linux 一个完整的shell脚本调试工具
- ps简单合成一个微小人像
- 监管科技与证券基金行业智能生态
- 条形码的打印,pdf打印条形码
- 利用Python进行数据分析(附详细案例)
- 两万字长文-设计模式总结
热门文章
- 分享一批国内常用的tracker地址
- 数学--数论--容斥定理完全解析(转)
- 模拟实现EXT2文件系统
- linux安装mysql出错( file /usr/share/mysql/czech/errmsg.sys from install of MySQL-server-5.5.31-2.el6.i6)
- leetcode刷题 162.寻找峰值
- % 在C语言中的用法
- 一种新的8B/10B编解码硬件设计方法
- __FUNCTION__, __FILE__, __LINE__ (原)
- 遭遇棘手 交接_Librosa的城市声音分类-棘手的交叉验证
- 机器学习 多变量回归算法_如何为机器学习监督算法识别正确的自变量?