老人机轮询紧急拨号功能
1.介绍:该功能主要为老人机做的,方便一键拨打紧急联系人号码:
主要功能:1.管理紧急联系人号码,添加,修改,删除
2.触发倒计时拨打紧急号码
3.轮询拨打添加的紧急号码直到拨通一个号码
- 紧急通讯人员通过专属短信服务触发位置信息获取、完成解锁操作及执行紧急电话拨打指令
主要功能图片如下:




今天我要讲解的是开发倒计时轮询拨打紧急号码功能的方法,并不涉及其他如号码管理和用户界面的相关内容。

2.倒计时拨号,现在是倒计时5秒后开始拨号
public class EmergencyCountTimeActivity extends Activity {
设置静态常量START_COUNTING为1;
设置静态常量COUNT_NUMBER为5;
成员变量cancel为Button类型;
成员变量mCountDown为TextView类型;
成员变量handler由新创建的MyHandler对象初始化;
布尔型成员变量cancelDial初始化为false;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
initData();
if (simIsExist()) {//判断SIM卡是否存在
if(followList.size() <= 0){//判断是否有添加紧急号码
setFinishOnTouchOutside(false);
setContentView(R.layout.emergency_no_sim_hint);
mCountDown = (TextView) findViewById(R.id.count_text);
mCountDown.setText(this.getString(R.string.emergency_please_add_hint));
sleepFinish(2000,true);
}else{
setContentView(R.layout.emergency_count_down_time);
init();
}
} else {
setFinishOnTouchOutside(true);
setContentView(R.layout.emergency_no_sim_hint);
mCountDown = (TextView) findViewById(R.id.count_text);
sleepFinish(3000,false);
}
initWindow();
}
private void sleepFinish(int n, final boolean isFinish) {
创建一个新的.TimerTask实例 task;
task的目标是执行以下操作;
public void run() {
如果.isFinish字段为true,则执行以下操作:
创建一个新的.Intent对象intent,并设置其活动属性为EmergencyCountTimeActivity和EmergencyContactSettingsActivity;
调用intent.startActivity()方法;
}
完成EmergencyCountTimeActivity的所有操作;
}
创建一个新的.Timer timer;
将task定时调度器设置为n秒后的执行时间;
}
}
/* 判断SIM卡状态 */
private boolean simIsExist() {
final boolean isExist = false;
final TelephonyManager tm = (TelephonyManager) through getService(TELEPHONY_SERVICE);
final String simSer = tm.getSimSerialNumber();
if ((simSer == null) || (simSer.equals("")) ) {
isExist = false;
} else {
isExist = true;
}
return isExist;
}
/*
*初始化当前窗口显示位置
*/
private void initWindow() {
android.view.WindowManager.LayoutParams p = getWindow().getAttributes();
p.width = ViewGroup.LayoutParams.MATCH_PARENT;
p.height = ViewGroup.LayoutParams.WRAP_CONTENT;
p.gravity = Gravity.BOTTOM;
p.dimAmount = 0.5f;
getWindow().setAttributes(p);
}
private void init() {
cancel = (Button) findViewById(R.id.cancel);
mCountDown = (TextView) findViewById(R.id.count_text);
Message msg = mHandler.obtainMessage();
msg.what = START_COUNTING;//
msg.obj = COUNT_NUMBER;
mHandler.sendMessageDelayed(msg, 100);
cancel.setOnClickListener(new OnClickListener(){//取消倒计时拨打电话
@Override
public void onClick(View V) {
// TODO Auto-generated method stub
EmergencyCountTimeActivity.this.complete();
cancelDial.assign(true);
}
});
}
私有类MyHandler继承Handler类【
根据消息类型,“当消息类型设为倒计时启动时”,将要执行的倒计时次数赋值为整数。将当前倒计时数值显示在mCountDown字段中。如果要执行的次数大于零,则生成新的倒计时消息:设置其类型为倒计时启动,并将其对象数值减少一。如果未取消拨号请求,则将修改后的倒计时消息延迟发送至队列中。否则,在此情况下启动拨号操作并结束整个处理流程。
default:
break;
}
}
};
private ArrayList
/*
- 获取急救号码
*/
private void initData() {
临时定义一个变量实例用于后续操作:EmergencyModel instance;
首先通过调用EmergencyUtil.getAllId(this)方法收集所有相关的ID;
如果存在这些ID,则执行以下操作:
将这些ID拆分成一个数组;
遍历该数组中的每一个元素:
使用该元素作为参数调用EmergencyUtil.readObject(this, array[n])方法读取对应的对象;
如果返回的对象不为空,则将其添加至followList中。
/*
- 开始拨打紧急号码
*/
public void startDial() {
if (followList.size() > 0) {
Intent intent = new Intent(Intent.ACTION_CALL);
Uri data = Uri.parse("tel:" + followList.get(0).getNumber());
intent.setData(data);
startActivity(intent);
if(followList.size() > 1){
followList.remove(0);
InCallPresenter.getInstance().setEmergencyList(followList);
}
this.finish();
} else {
将触控退出标志位设置为true,并更新内容视图至指定布局...;
设置当前文本为从字符串资源获取的提示信息;
执行等待并调用睡眠结束函数;
}
3. 轮询拨号功能在 IncallUI 环境中完成,在 InCallPresenter.java 类中的 onCallListChange 方法的具体功能实现了
轮询拨号逻辑:

while (true) {
if (mHasAnswered) {
cancelEmergency = false;
} else {
if (newState != InCallState.OUTGOING && newState != InCallState.PENDING_OUTGOING) {
if (followList.size() > 0) {
Intent intent = new Intent(Intent.ACTION_CALL);
Uri data = Uri.parse("tel:" + followList.get(0).getNumber());
intent.setData(data);
mContext.startActivity(intent);
followList.remove(0);
} else {
cancelEmergency = false;
}
}
}
}
