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.…

装饰模式(Decorator pattern)

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

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

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

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

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

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

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

13个代码注释的小技巧

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

让您的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;一个单元测试是用于判断某个特定条件(或者场景)下某个特定…

android功耗iphone,是心目中的安卓小屏旗舰吗?iPhone 8尺寸大小,4000mAh电池容量...

相信很多人都都喜欢小屏手机&#xff0c;但因为小屏手机总体需求不多&#xff0c;而且相对大屏更不好做&#xff0c;所以手机商都不愿意做小屏手机&#xff0c;这也导致市面上小屏手机非常少&#xff0c;苹果推出了iPhone 12 Mini&#xff0c;但是因为电池只有2200mAh&#xff…

mySQL 数据库错误

2019独角兽企业重金招聘Python工程师标准>>> java.sql.SQLException: The user specified as a definer (..%) does not exist 视图、存储过程的使用者若非其创建者&#xff0c;就会出现这样的错误 可以修改用户的权限或重新创建进行解决 转载于:https://my.oschina…

细说JavaScript对象(1):对象的使用和属性

JavaScript 中的一切都可以视为对象&#xff0c;除了两个特例&#xff1a;null 和 undefined。 false.toString(); // false [1, 2, 3].toString(); // 1,2,3function Foo(){} Foo.bar 1; Foo.bar; // 1 一个经常容易被误解的就是数字常量不能视为对象&#xff0c;实际上数字常…

access2003的使用

access2003中如何用sql语句创建表 http://zhidao.baidu.com/link?urldinVbwoI20Xz__NbcIeBPdkjeXRWmZNB0xJvdr0eMBqNflv_JcWgUoPw3ozFfqnTQ9FLkNv0XXs9loDR2Oc7Oq SQL 数据定义查询创建表&#xff1a; 第一张表&#xff08;藏书&#xff09; CREATE TABLE 藏书 (书号 Text(10)…

再见安卓 鸿蒙,安卓系统:鸿蒙系统,正式再见

原标题&#xff1a;安卓系统&#xff1a;鸿蒙系统&#xff0c;正式再见华为手机不能使用谷歌GMS服务已经差不多一年时间&#xff0c;据悉华为明年最新旗舰P40系列仍然不能使用GMS&#xff0c;最近爆料大神数码闲聊站称谷歌将不给华为手机授权Android R(安卓11系统)&#xff0c;…

wordpress html音乐,WordPress引用百度Ting音乐方法

对于个人博客来说&#xff0c;要在文章中添加音乐&#xff0c;如果放在自己服务器上&#xff0c;一方面是成本问题&#xff0c;其次&#xff0c;大部分博主用的国外服务器&#xff0c;而国外对版权看得比较重&#xff0c;基本上不允许上传音乐&#xff0c;所以我们通常都是通过…

html edge浏览器 图片,浏览器时序图及 Microsoft Edge 构架

本文又是我的作业&#xff0c;完成思路借鉴了 版权说明。作业要求针对一款典型浏览器&#xff0c;绘制浏览器处理时序图对用户界面进行操作(如拖拽窗口)带有 JavaScript 脚本 HTML 文档查阅资料&#xff0c;绘制 Edge 浏览器的参考架构浏览器时序图对用户界面进行操作(如拖拽窗…

您需要了解的跨阻放大器——第1部分

跨阻放大器&#xff08;TIA&#xff09;是光学传感器&#xff08;如光电二极管&#xff09;的前端放大器&#xff0c;用于将传感器的输出电流转换为电压。跨阻放大器的概念很简单&#xff0c;即运算放大器&#xff08;op amp&#xff09;两端的反馈电阻&#xff08;RF&#xff…

Objective-C组合模式(Composite)

什么是组合模式&#xff1f; 官方&#xff1a;将对象组合成树形结构以表示“部分-整体”的层次结构&#xff0c;组合模式使用户使用单独对象和组合对象具有一致性。 个人理解&#xff1a;组合模式就相当于一个大家族&#xff0c;每个人都是家族中的一部分&#xff0c;整个家族就…

WP7应用开发笔记(3) 界面设计

界面设计 回顾一下按钮清单&#xff1a; 播放控制播放/暂停Space 停止F4 快进Right 快退Left 快进X2ControlRight 快退X2ControlLeft 快进X3AltRight 快退X3AltLeft音量放大Up 缩小Down 静音M节目下一个PageDown 上一个PageUp基本上就是把这些按钮布置到480*800的屏幕上。 快进…