消息调度器:使用Tizen联系人和信息设备API
PUBLISHED
消息调度程序 - 使用Tizen联系和消息设备的API
本教程使用了示例应用程序演示如何在自己的web应用程序中使用Tizen提供的 Contact
和 Messaging
设备的API。采用示例应用程序“消息调度程序”,您可以安排在某个特定的日期和时间进行发送一个SMS信息(给从设备中的一个联系人)。 您也可以编辑和删除已经安排好的消息。 该示例应用程序只支持单个收件人(虽然也可以扩展到支持多个收件人)。该应用程序也使用到了Web SQL数据库和本地存储,用于存放永久性数据。 现在,让我们看看在示例应用程序的实现过程中如何使用了这个API。
该应用程序主要采用下面的API和方法,
1 使用contact(联系人)设备API
使用联系人API,您可以管理设备地址簿,实现访问,修改,添加和删除指定地址簿中的联系人,示例应用程序中,当用户点击搜索按钮选择消息的接收者时,将会初始化地址簿并检索联系人。 另外,在初始化自身的时候同样创建了Web SQL数据库。 下面是示例应用程序的初始化代码。
function InitAddressBook() { /* Initialize */ console.log("initialize called"); try{ gAddressbook = tizen.contact.getDefaultAddressBook(); } catch(e){ console.log('getDefaultAddressBook() error: ' + e.message); } if(gAddressbook){ var sortingMode = new tizen.SortMode('name.firstName', 'ASC'); var phoneFilter = new tizen.AttributeFilter('phoneNumbers.number','CONTAINS', ''); gAddressbook.find(onAllContactsFindSuccess, onError, phoneFilter,sortingMode); // create DB if (localStorage.getItem('dbcreated') !='yes') { console.log("creating database"); createDatabase(); localStorage.setItem('dbcreated','yes'); } } else{ console.log('getDefaultAddressBook() not initialized '); } } function onError(){ console.log('gAddressbook.find() failed'); }
以下函数实现了检索联系人,以备列表显示。
function onAllContactsFindSuccess(contacts) { console.log("onAllContactsFindSuccess called"); var name, str = ''; $("#cont-list").empty(); for ( var i = 0; i < contacts.length ; i++) { str = '<li class="ui-li-has-multiline ui-li-text-ellipsis">' + contacts[i].name.firstName + '</li>'; $("#cont-list").append(str).listview("refresh"); } // for loop ends }
2 使用消息设备API
使用消息API,你可以创建,发送,阅读邮件,并在管理已保存的消息。示例应用程序中,函数sendScheduledMsgs()在用户指定的日期/时间被闹钟触发,它查询SQL数据库中原定于该日期/时间发送的信息,如果存在便发送该SMS信息。 该函数还会将信息投递的状态更新到数据库中,以便在消息的详细信息中察看。
// After retrieving the messages from database if(noOfMsgs) { // Now send all scheduled msgs for(var i=0; i < noOfMsgs; i++) { if( results.rows.item(i).Status != "Failed" ) { var name=results.rows.item(i).Name; var phone=results.rows.item(i).PhoneNumber; var msg=results.rows.item(i).Msg; tizen.messaging.getMessageServices("messaging.sms", serviceListCB, serviceErrorCB); function messageSent(recipients) { alert("Scheduled message sent to " + name); db.transaction(function (tx) { var sqlquery = 'UPDATE MsgTable SET Status='+'"' + status + '"' + 'WHERE Name="' + name + '" and SYEAR="' + tyear + '" and SMONTH="' + tmonth + '" and SDAY="' + tday + '" and SHOUR="' + thour + '" and SMIN="' + tmin + '";' //'"' + ');' ; console.log(sqlquery); tx.executeSql(sqlquery); }); } function messageFailed(error) { status = "Failed"; db.transaction(function (tx) { var sqlquery = 'UPDATE MsgTable SET Status='+'"' + status + '"' + 'WHERE Name="' + name + '" and SYEAR="' + tyear + '" and SMONTH="' + tmonth + '" and SDAY="' + tday + '" and SHOUR="' + thour + '" and SMIN="' + tmin + '";' //'"' + ');' ; console.log(sqlquery); tx.executeSql(sqlquery); }); alert("Failed sending msg-" + error.message); console.log("Failed sending msg- Error: " + error.message); } function serviceErrorCB(error) { console.log("error getting messaging service: " + error.message); } function serviceListCB(services) { if (services.length > 0) { var msgobj = new tizen.Message("messaging.sms", {plainBody:msg, to:[phone]}); services[0].sendMessage(msgobj, messageSent, messageFailed); } } } } } else{ console.log("No scheduled msgs to send"); }
3 使用闹钟设备API
该应用程序还使用了闹钟API来启动一个应用程序(在我们的例子中,即触发示例应用程序本身)。 作为用户调度SMS消息的一部分,将为用户选定的日期和时间创建一个绝对闹钟事件。 连同其它用户数据,闹钟ID也被存储到SQL数据库。 当用户编辑已调度的消息或者删除已调度的消息时,会用到闹钟ID。 更多详细内容请参见示例程序中的 updateMsg()
和 deleteSchMsg()
函数。 如下代码截取自函数 scheduleMsg()
,这部分代码展示了如何为特定的日期/时间创建绝对闹钟事件,并存储到SQL数据库中。
var db = openDatabase('Msgdb', '1.0', 'Messages Database', 2 * 1024 * 1024); db.transaction(function (tx) { console.log("creating abs alarm event"); // Create alarm event for the new msg var date = new Date(year, month, day, hour, min); var absalarm = new tizen.AlarmAbsolute(date); tizen.alarm.add(absalarm, "HeohmeJ13H.MsgScheduler"); console.log("abs alarm event created with ID: " + absalarm.id); console.log("adding data to database"); var sqlquery = 'INSERT INTO MsgTable (Name,Status,PhotoUri,PhoneNumber,Msg,AlarmId,SMONTH,SDAY,SYEAR,SHOUR,SMIN) VALUES ('+ '"' + contactName + '"' + ',' + '"'+ status + '"'+ ','+ '"'+ contactPhoto + '"'+ ',' + '"' + phoneNumber + '"'+ ','+ '"'+ userMsg + '"' + ',' + '"'+ absalarm.id + '"' + ','+ '"'+ month+ '"' + ',' + '"' +day+ '"'+ ',' + '"' + year+ '"'+ ',' + '"' + hour+ '"'+ ',' + '"' + min + '"'+ ');' ; tx.executeSql(sqlquery); console.log("Insert to database successfull"); alert("Scheduled Message for " + contactName ); });
4 Web SQL数据库和持久性数据本地存储
示例程序将所有的联系人属性存储到 web SQL database
表中。 根据需要,可以发送,编辑或删除数据库列表中的联系人条目。 在初始化地址簿时,会调用下面的createDatabase()函数。
function createDatabase() { var db = openDatabase('Msgdb', '1.0', 'Messages Database', 2 * 1024 * 1024); db.transaction(function (tx) { tx.executeSql('CREATE TABLE IF NOT EXISTS MsgTable (P_Id INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL ,Name varchar(255) NOT NULL, PhotoUri varchar(255),Status varchar(255),PhoneNumber varchar(255), Msg varchar(255), AlarmId varchar(255),SMONTH varchar(255), SDAY varchar(255), SYEAR varchar(255), SHOUR varchar(255), SMIN varchar(255))'); localStorage.setItem('msgTableCreated','yes'); console.log("createDatabase successfull"); }); }
为了避免频繁地访问数据库,示例应用程序使用 LocalStorage
存放了用户选择的已调度的联系人详细信息,用于编辑和删除操作。 函数getScheduledMsgs()将用户选择的信息存储到本地,如下所示,
$(document).on("click","ul#msglist > li", function(e){ // when clicked on any contact var ItemIndex=$(this).index(); console.log("Item Index of scheduled msgs: "+ ItemIndex ); // Store the item details to localstorage var rname = results.rows.item(ItemIndex).Name; var rstatus = results.rows.item(ItemIndex).Status; var rphotoUri = results.rows.item(ItemIndex).PhotoUri; var rmsg = results.rows.item(ItemIndex).Msg; var ralarmId = results.rows.item(ItemIndex).AlarmId; var ryear = results.rows.item(ItemIndex).SYEAR; var rmonth = results.rows.item(ItemIndex).SMONTH; var rday = results.rows.item(ItemIndex).SDAY; var rhour = results.rows.item(ItemIndex).SHOUR; var rmin = results.rows.item(ItemIndex).SMIN; localStorage.setItem('recptname', rname ); localStorage.setItem('recptstatus',rstatus); localStorage.setItem('recptphoto',rphotoUri); localStorage.setItem('recptMsg',rmsg); localStorage.setItem('recptAlarmId',ralarmId); localStorage.setItem('recptyear', ryear ); localStorage.setItem('recptmonth',rmonth); localStorage.setItem('recptday', rday ); localStorage.setItem('recptrhour', rhour ); localStorage.setItem('recptrmin',rmin); console.log("The selected items details, "+ "Name: " + rname + " Msg: " + rmsg + " AlarmId: "+ ralarmId); schdMsgDetails(); });
可供下载的参考示例应用程序, 请见附件。
截图:
图1:示例应用程序主屏幕(可从联系人信息中调度一个消息)
图2:已调度消息列表
图3:已调度消息的详细信息,可以编辑或删除调度的消息
开发环境:
Tizen SDK Version : 2.2.0 Build id : 20130708-1957