日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問(wèn) 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) > 编程资源 > 编程问答 >内容正文

编程问答

android应用开发全程实录-实现甩动拨打和挂断电话

發(fā)布時(shí)間:2023/12/13 编程问答 27 豆豆
生活随笔 收集整理的這篇文章主要介紹了 android应用开发全程实录-实现甩动拨打和挂断电话 小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

今天繼續(xù)給大家?guī)?lái)《Android應(yīng)用開(kāi)發(fā)全程實(shí)錄》中的章節(jié),這部分是講傳感器中的一個(gè)實(shí)例。

通過(guò)上面的例子我們學(xué)會(huì)了如何獲得某種類型的傳感器,下面通過(guò)一個(gè)實(shí)例來(lái)學(xué)習(xí)如何使用某一個(gè)類型的傳感器。我們以加速傳感器為例,來(lái)實(shí)現(xiàn)這樣一個(gè)功能:搖動(dòng)手機(jī)便自動(dòng)撥打某親情號(hào)碼,并實(shí)現(xiàn)再次搖動(dòng)則掛機(jī)的功能。

?

工程目錄:EX_12_03

第一步,UI布局main.xml的代碼如下,其運(yùn)行效果如圖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
="當(dāng)前狀態(tài):就緒"
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
="掛機(jī)"/>
</LinearLayout>

第二步,掛電話需要用到系統(tǒng)的Itelephony類的支持,由于Google從Android 2.1 SDK版本后,屏蔽了com.android.internal.telephony. Itelephony類,因此,需要從Android源碼下載,找到該類并導(dǎo)入到工程目錄下,記得包名一致。

第三步,Activity類ShakeSensorActivity的實(shí)現(xiàn)。該類實(shí)現(xiàn)SensorListener接口,添加加速度偵聽(tīng)事件,通過(guò)判斷設(shè)備X、Y、Z方向的總晃動(dòng)值來(lái)判斷是否啟動(dòng)打電話和掛機(jī)操作。以撥打10086測(cè)試為例,當(dāng)設(shè)備總晃動(dòng)值大于100作為一個(gè)測(cè)試判斷點(diǎn),如果當(dāng)前沒(méi)有在通話界面,就通過(guò)Intent啟動(dòng)撥打電話,否則就掛機(jī)操作。設(shè)備搖動(dòng)時(shí),啟動(dòng)電話、掛機(jī)的界面狀態(tài)如圖圖12-11、圖12-12所示。

?

?

?

▲圖12-10? 軟件運(yùn)行效果圖            ▲圖12-11? 電話啟動(dòng)界面? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?圖12-12? 搖動(dòng)設(shè)備掛機(jī)時(shí)的狀態(tài)界面

下面就來(lái)看看代碼:

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;// 持續(xù)時(shí)間 
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) {
// 掛機(jī)
closePhone();
}
});
// 獲取傳感器管理器
sm = (SensorManager) getSystemService(Context.SENSOR_SERVICE);
// 注冊(cè)加速度傳感器 
sm.registerListener(this,
SensorManager.SENSOR_ACCELEROMETER,SensorManager. SENSOR_DELAY_NORMAL);

}
@Override
public void finish() {
// TODO Auto-generated method stub
super.finish();
sm.unregisterListener(this);// 注銷偵聽(tīng)

}
@Override
public void onAccuracyChanged(int sensor, int accuracy) {
// 精度改變,該方法實(shí)質(zhì)上不做任何操作,它只在每次調(diào)用時(shí),添加一個(gè)日志項(xiàng)
}
@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毫秒檢測(cè)一次
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,重新累計(jì)計(jì)數(shù)
lastX = 0;
lastY = 0;
lastZ = 0;
lastTime = 0;
currTime = 0;
if (!isCalling) {
callPhoneNumber10086();
((TextView) mainView.findViewById(R.id.state)).setText("當(dāng)前狀態(tài): 通話中...");
} else {
closePhone();
((TextView) mainView.findViewById(R.id.state)).setText("當(dāng)前狀態(tài):通話結(jié)束...");
}
}
lastX = x;
lastY = y;
lastZ = z;
lastTime = currTime;
}

/**
* tell 10086打開(kāi)通話界面
*/
private synchronized void callPhoneNumber10086() {
isCalling = true;
Intent myIntentDial = new Intent(Intent.ACTION_CALL,Uri.parse("tel:" + 10086));
startActivity(myIntentDial);
}

/**
* 結(jié)束通話
*/
private synchronized void closePhone() {
try {
getTelephony();
iTelephony.endCall();
isCalling = false;
} catch (RemoteException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}

}

/**
* 初始電話 實(shí)例
*/
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();
}

}

通過(guò)getTelephony()方法,初始一個(gè)iTelephony實(shí)例,方便調(diào)用,目前只用到了掛機(jī)關(guān)閉通話,打電話也可以通過(guò)iTelephony.dial(“10086”)直接撥打。這樣就輕松實(shí)現(xiàn)了用傳感器實(shí)現(xiàn)甩動(dòng)打、掛電話功能。



?

轉(zhuǎn)載于:https://www.cnblogs.com/noTice520/archive/2011/12/27/2303492.html

總結(jié)

以上是生活随笔為你收集整理的android应用开发全程实录-实现甩动拨打和挂断电话的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。

如果覺(jué)得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。