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;
@Override
public 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() {
@Override
public void onClick(View v) {
// 打电话
callPhoneNumber10086();
}
});
((Button) mainView.findViewById(R.id.stop)).setOnClickListener(new OnClick- Listener() {
@Override
public void onClick(View v) {
// 挂机
closePhone();
}
});
// 获取传感器管理器
sm = (SensorManager) getSystemService(Context.SENSOR_SERVICE);
// 注册加速度传感器 
sm.registerListener(this,
SensorManager.SENSOR_ACCELEROMETER,SensorManager. SENSOR_DELAY_NORMAL);

}
@Override
public void finish() {
// TODO Auto-generated method stub
super.finish();
sm.unregisterListener(this);// 注销侦听

}
@Override
public void onAccuracyChanged(int sensor, int accuracy) {
// 精度改变,该方法实质上不做任何操作,它只在每次调用时,添加一个日志项
}
@Override
public 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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/261048.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

static的应用以及静态与非静态的区别

先前看到一个技术大牛写了一个关于静态成员与非静态成员&#xff0c;静态方法和非静态方法的各自区别&#xff0c;觉得挺好的&#xff0c;在这里写一个小程序来说明这些区别。 package com.liaojianya.chapter5; /*** This program will demonstrate the use of static method.…

Python中抓网页的小陷阱

这边博客已经搬家到这里了。我的个人博客&#xff0c;风格我自己更喜欢&#xff0c;也可以完全控制。当然&#xff0c;会花一点钱&#xff0c;但是基本能承受。 欢迎各位来观光&#xff0c;博客园很棒&#xff0c;但是有一个自己能控制的网站也许会更好。另外&#xff0c;不能发…

C# 打印文件

http://support.microsoft.com/kb/322091转载于:https://www.cnblogs.com/xbgz/p/3431463.html

c语言穷举算法 枚举法,c语言枚举法 穷举法 ppt课件

枚举法 穷举法 笨人之法 把所有可能的情况一一测试 筛选出符合条件的各种结果进行输出 分析 这是个不定方程 三元一次方程组问题 三个变量 两个方程 x y z 1005x 3y z 3 100设公鸡为x只 母鸡为y只 小鸡为z只 百元买百鸡问题分析 x y z 1005x 3y z 3 100 三重循环 voidmain intx…

装饰模式(Decorator pattern)

装饰模式又名包装(Wrapper)模式。装饰模式以对客户端透明的方式扩展对象的功能&#xff0c;是继承关系的一个替代方案。 装饰模式的结构 装饰模式以对客户透明的方式动态地给一个对象附加上更多的责任。换言之&#xff0c;客户端并不会觉得对象在装饰前和装饰后有什么不同。装饰…

恶补sql知识(一)

索引的定义 SQL Server的索引值是对数据库中一个或者多个列的值进行排序的结构。 索引几个特性&#xff1a; 1&#xff09;索引可以提高数据的访问速度 只有在适当的位置建立索引&#xff0c;就能大幅度提高,实际上&#xff0c;您可以把索引理解为一种特殊目录。微软的SQL SERV…

php连接数据库输出的中文几个字就…

我们首先假设数据库中采用的编码为UTF-8 这时我们在PHP页面中应当首先添加 "Content-Type" content"text/html; charsetutf-8" />文件保存时的编码类型也必须是utf-8。 之后在数据库查询前添加 mysql_query("set names utf8");注&#xff1a;…

android开启服务器配置,Android基于XMPP开发(一)【openfire服务器配置】

OpenFireOpenFire 是采用Java开发的基于XMPP(Jabber)协议&#xff0c;开源实时协作(RTC)服务器。Smack 是用 Java编 写的XMPP客户端代码库&#xff0c;是 spark 的核心开源界总是有许多有趣的东东&#xff0c;这三个合起来就是一个完整的XMPP IM 实现。OpenFire ——服务器端Sp…

Python 生成器 迭代器

1.1 生成器通过列表生成式&#xff0c;我们可以直接创建一个列表。但是&#xff0c;受到内存限制&#xff0c;列表容量肯定是有限的。而且&#xff0c;创建一个包含100万个元素的列表&#xff0c;不仅占用很大的存储空间&#xff0c;如果我们仅仅需要访问前面几个元素&#x…

寻路基本工具类定义 AIDefine.cpp

1 #include "AIDefine.h" 2 3 PointI AI_FindHelpPoint[8] {PointI(-1,0),PointI(0,-1),PointI(1,0),PointI(0,1),PointI(-1,-1),PointI(1,-1),PointI(1,1),PointI(-1,1)}; 转载于:https://www.cnblogs.com/liusijian/p/3438542.html

android相对布局代码,Android基础_3 Activity相对布局(示例代码)

相对布局要比前面讲的线性布局和表格布局要灵活一些&#xff0c;所以平常用得也是比较多的。相对布局控件的位置是与其周围控件的位置相关的&#xff0c;从名字可以看出来&#xff0c;这些位置都是相对的&#xff0c;确定出了其中一个控件的位置就可以确定另一个控件的位置了。…

WSDL文件生成WEB service server端C#程序

一般一个已经实现功能的WEB Server会发布自己的WSDL文件&#xff0c;供客户端生成代理类。 但有时是先有的server与client交互的接口定义&#xff08;WSDL&#xff09;文件&#xff0c;然后由server和client端分别写程序&#xff0c;一个提供web服务&#xff0c;一个使用web服…

php二维数组排序 按照指定的key 对数组进行排序

2019独角兽企业重金招聘Python工程师标准>>> /*** desc arraySort php二维数组排序 按照指定的key 对数组进行排序* param array $arr 将要排序的数组* param string $keys 指定排序的key* param string $type 排序类型 asc | desc* return array*/ function arrayS…

剑指Offer - 九度1367 - 二叉搜索树的后序遍历序列

剑指Offer - 九度1367 - 二叉搜索树的后序遍历序列2013-11-23 03:16 题目描述&#xff1a;输入一个整数数组&#xff0c;判断该数组是不是某二叉搜索树的后序遍历的结果。如果是则输出Yes,否则输出No。假设输入的数组的任意两个数字都互不相同。 输入&#xff1a;每个测试案例包…

13个代码注释的小技巧

13个代码注释的小技巧 这篇文章是由Jos M. Aguilar在他卓越的博客中以西班牙语的形式首发&#xff0c;其后Timm Martin在获得Aguilar先生的授权下&#xff0c;对该文章进行翻译、修改&#xff0c;并且在DevTopics上发布。 以下13个小技巧可以使得你的代码在长时间内依然能够保…

android webview onconsolemessage,Android WebView一些特殊的使用

在Android5.0之前&#xff0c;webView默认是允许加载混合网络协议内容的&#xff1b;在5.0以上&#xff0c;默认不允许加载http和https的混合内容if (Build.VERSION.SDK_INT > Build.VERSION_CODES.LOLLIPOP) {webView.getSettings().setMixedContentMode(WebSettings.MIXED…

让您的Xcode键字如飞

2019独角兽企业重金招聘Python工程师标准>>> 作者&#xff1a;吴白&#xff08;微博&#xff09; 手指在键盘上飞速跳跃,终端上的代码也随着飞舞,是的这确实很酷。优秀的程序员总是这么一群人&#xff0c;他们不拘于现状&#xff0c;不固步自封&#xff0c;他们喜欢…

【Android Developers Training】 6. 配置Action Bar

注&#xff1a;本文翻译自Google官方的Android Developers Training文档&#xff0c;译者技术一般&#xff0c;由于喜爱安卓而产生了翻译的念头&#xff0c;纯属个人兴趣爱好。 原文链接&#xff1a;http://developer.android.com/training/basics/actionbar/setting-up.html 配…

android 7 创建文件夹,Android 在 res/layout 文件夹 下创建一个 子文件夹实例

Android 资源文件夹 Layout 文件夹Layout文件是存放Android的布局文件的资源文件夹&#xff0c;但是如果你想要在里面创建子文件夹&#xff0c;你会发现xml文件报错。如何在Layout文件夹下方创建Layout的子文件夹。这边我们需要著一个一个点就是我们的Layout 文件夹是属于资源文…

一步一步学NUnit

转载&#xff1a;http://tech.sina.com.cn/s/2009-07-17/1129988785.shtml 单元测试基础知识 单元测试是开发者编写的一小段代码&#xff0c;用于检验被测代码的一个很小的、很明确的功能是否正确。通常而言&#xff0c;一个单元测试是用于判断某个特定条件(或者场景)下某个特定…