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.pswp.cn/news/261048.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/261048.shtml
英文地址,請注明出處:http://en.pswp.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;一個單元測試是用于判斷某個特定條件(或者場景)下某個特定…