今天继续给大家带来《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应用开发全程实录-实现甩动拨打和挂断电话相关推荐

  1. android应用开发全程实录-你有多熟悉listview? .

    本文版权归 csdn noTice501 所有,转载请详细标明原作者及出处,以示尊重! 作者:noTice501 原文:http://blog.csdn.net/notice520/article/d ...

  2. android应用开发全程实录-你有多熟悉listview?

    今天给大家带来<android应用开发全程实录>中关于listview和adatper中的部分.包括listview的基本使用,listview的优化等. 我们经常会在应用程序中使用列表的 ...

  3. android应用开发全程实录出版

    这本书经历了大半年的时间,终于可以和读者见面了.书籍由我和微度网http://www.microdu.com/其他两位资深开发者共同完成. 最近经历了很多,应该是人生的一个转折点吧.总会有一些选择,将 ...

  4. android项目 用手机,基于Android平台的手机记账应用开发全程实录|Android项目手机记账应用...

    <基于Android平台的手机记账应用开发全程实录> 百度云链接:http://pan.baidu.com/s/1dFFPWpr 密码: j435 01.项目概述与项目需求 02.数据库设 ...

  5. 基于Android平台的手机记账应用开发全程实录|Android项目手机记账应用

    <基于Android平台的手机记账应用开发全程实录> 百度云链接:http://pan.baidu.com/s/1dFFPWpr 密码: j435 01.项目概述与项目需求 02.数据库设 ...

  6. 【原创】【推荐】《ASP.NET 3.5+SQL Server网站模块化开发全程实录》出版记

    进过半年多的努力,<ASP.NET 3.5+SQL Server网站模块化开发全程实录>一书终于得以由清华大学出版社顺利出版. 第一次出版此类图书,不免其中会有诸多纰漏,还望广大读者不吝指 ...

  7. android 关闭蓝牙打电话功能,Android蓝牙开发【八】hfp接听、挂断电话

    继续研究hfp相关功能.蓝牙耳机可以控制手机接听.拒接.挂断电话,拨打电话等功能.本文主要分析下起这些操作的大致流程. 在系统应用Bluetooth中com_android_bluetooth.cpp ...

  8. Android 蓝牙开发(八)hfp接听、挂断电话

    转载请注明出处:http://blog.csdn.net/vnanyesheshou/article/details/71429860 本文已授权微信公众号 fanfan程序媛 独家发布 扫一扫文章底 ...

  9. android 自动挂断,android实现接通和挂断电话

    本文实例为大家分享了android实现接通和挂断电话的具体代码,供大家参考,具体内容如下 关键代码:[PhoneUtils类] package com.ebupt.phonerecorddemo.se ...

最新文章

  1. matlab简单程序实例_visual basic VB.NET实例系列教程第一节(简单实用抽奖程序)...
  2. 【Spring】Spring学习笔记-01-入门级实例
  3. linux 删除文件_Linux删除文件夹命令有哪些
  4. 看不清的融资迷局 二线玩家字节跳动在打什么主意?
  5. 【渝粤题库】国家开放大学2021春1375Matlab语言及其应用题目
  6. 支付宝牵手全球最大公募基金 上线“帮你投” 800元起投
  7. go语言实现zip压缩与解压
  8. 将url参数转为json对象
  9. 自绘GroupBox控件
  10. MATLAB adf检验和kpss检验结果说明
  11. 语法练习——动名词专项训练
  12. HDU 3966 Aragorns Story
  13. VMware不支持虚拟化的Intel VT-X/EPT
  14. 逍遥模拟器怎样连接android,逍遥安卓模拟器
  15. 07 linux 一个完整的shell脚本调试工具
  16. ps简单合成一个微小人像
  17. 监管科技与证券基金行业智能生态
  18. 条形码的打印,pdf打印条形码
  19. 利用Python进行数据分析(附详细案例)
  20. 两万字长文-设计模式总结

热门文章

  1. 分享一批国内常用的tracker地址
  2. 数学--数论--容斥定理完全解析(转)
  3. 模拟实现EXT2文件系统
  4. linux安装mysql出错( file /usr/share/mysql/czech/errmsg.sys from install of MySQL-server-5.5.31-2.el6.i6)
  5. leetcode刷题 162.寻找峰值
  6. % 在C语言中的用法
  7. 一种新的8B/10B编解码硬件设计方法
  8. __FUNCTION__, __FILE__, __LINE__ (原)
  9. 遭遇棘手 交接_Librosa的城市声音分类-棘手的交叉验证
  10. 机器学习 多变量回归算法_如何为机器学习监督算法识别正确的自变量?