消息调度器:使用Tizen联系人和信息设备API

消息调度程序 - 使用Tizen联系和消息设备的API

本教程使用了示例应用程序演示如何在自己的web应用程序中使用Tizen提供的 ContactMessaging 设备的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

文件附件: