如何在混合Android应用程序中添加日历事件






4.81/5 (5投票s)
本文将向您展示如何在混合型Android应用中访问您的Android日历事件。
引言
Cordova PhoneGap库是一个很棒的JavaScript库,允许开发者在混合应用中实现原生功能。但是,PhoneGap只提供有限的功能范围。例如,它不提供向手机本地日历事件添加事件的方法。然而,使用cordova Java库有一个简单的解决方案。本文将解释如何使用cordova库来实现此功能(**注意**:本文假设您的文件结构已正确设置)。
Using the Code
这包含几个部分。首先,我们将从JavaScript开始。您必须首先确保已安装最新版本的PhoneGap库,请访问PhoneGap.com。
在您的index.html文件中包含cordova.js文件和用于执行cordova `callNativeFunction`的代码。`callNativeFunction`是cordova定义的函数,用于调用应用程序的原生函数,在本例中将创建事件。此函数具有三个参数:第一个是结果处理程序,用于打印调用的结果;第二个参数是错误处理函数,如果调用中出现错误,则会执行此函数;最后一个参数“`returnSuccess`”是发送到原生函数的消息。在我们的例子中,`returnSuccess`将包含创建事件所需的所有信息。例如,事件的日期/时间和名称。`calendarPlugin`对象是一个您将创建的JavaScript对象,但是您需要在不同的JavaScript文件中创建此对象。我们稍后将讨论这部分。
<script type="text/javascript" src="cordova.js"></script>
<script type="text/javascript" src="calendarPlugin.js"></script>
<script>
function callNativePlugin(returnSuccess){
calendarPlugin.callNativeFunction
(nativePluginResultHandler, nativePluginErrorHandler, returnSuccess);
}
function nativePluginResultHandler(result){
console.log("SUCCESS:\r\n" + result);
}
function nativePluginErrorHandler(error){
alert("Error: \r\n" + error);
}
</script>
现在在您的Sencha视图中,添加一个带有点击监听器的按钮。
{
xtype:'button',
width:100,
height:44,
ui:'red',
listeners:{
tap:function(){
callNativePlugin('success,' + eventTitleData + ','
+ eventEndDateData +
',' + eventStartDateData + ',' +
eventLocationData + ',' +eventDescriptionData);
}
}
}
现在我们已经设置好了所有HTML和JavaScript,是时候创建`calendarPlugin`对象了。创建一个名为calendarPlugin.js的新JavaScript文件并添加以下代码片段。让我解释一下这段代码。在这里,我们定义了一个具有属性`callNativeFunction`的对象。`callNativeFunction`是一个JavaScript函数,它执行cordova.exe函数。您只需要关心两个参数。一个是您调用的Android类的名称。在本例中,它是稍后我们将定义的“`com.myPlugins.CalendarPlugin`”类。接下来是操作“`addToCalendar`”,我们将在`CalendarPlugin`类中定义它。
var calendarPlugin = {
callNativeFunction: function(success, fail, resultType){
return cordova.exec(success, fail,
"com.myPlugins.CalendarPlugin",
"addToCalendar",[resultType]);
}
};
现在我们已经完成了JavaScript方面的所有步骤,我将开始讨论Android方面需要什么。在www文件夹下,添加您的calendarPlugin.js文件。现在,我们需要创建我们的Android类来处理来自cordova的调用并执行添加日历事件的代码。在我们创建Java文件之前,我们需要在`res/xml`文件夹下`config.xml`文件的Plugins标签内添加以下行。
<plugin name="com.myPlugins.CalendarPlugin"
value="com.myPlugins.CalendarPlugin"/>
创建一个名为“`com.MyPlugins`”的包和一个名为“`CalendarPlugin`”的类。此类将扩展`CordovaPlugin`类,这将允许我们实现我们的cordova插件。您的`Plugin`类必须重写cordova定义的execute方法之一。在我们的例子中,我们使用要执行的操作、JSON形式的数据和回调方法来调用`execute`方法。使用操作“`ACTION_EDIT`”指定一个意图,这将提供对给定数据的可编辑访问权限。然后调用`intent.setType()`,这用于为意图指定类型而不是数据。在本例中,我们指定了“`vnd.android.cursor.item/event`”的uri类型。游标是一个提供对数据库中行和列的随机读取访问的对象。在本例中,它是`Event`数据库。最后,确保通过调用`intent.putExtra(Events.TITLE, "YouTitle")`等来向您的`event`提供信息。您可以通过访问Android开发文档来了解更多关于CalendarContract.Events对象有哪些字段。
package com.myPlugins;
/***
* CalendarPlugin
*@author Kevin Morfin
**/
import java.util.GregorianCalendar;
import java.util.HashMap;
import java.util.Map;
import org.apache.cordova.api.CallbackContext;
import org.apache.cordova.api.CordovaPlugin;
import org.json.JSONArray;
import org.json.JSONException;
import android.content.Intent;
import android.provider.CalendarContract;
import android.provider.CalendarContract.Events;
import android.util.Log;
public class CalendarPlugin extends CordovaPlugin {
public static final String ACTION_STRING = "addToCalendar";
public static final String PARAMETER = "success";
@Override
public boolean execute(String action, JSONArray data,
CallbackContext callbackContext) throws JSONException {
if (ACTION_STRING.equals(action)){
//map month string values to integer value
Map<string,integer> months = new HashMap<string,integer>();
months.put("Jan", 0);
months.put("Feb", 1);
months.put("Mar",2);
months.put("Apr", 3);
months.put("May", 4);
months.put("Jun", 5);
months.put("Jul", 6);
months.put("Aug", 7);
months.put("Sep", 8);
months.put("Oct", 9);
months.put("Nov", 10);
months.put("Dec", 11);
Intent intent = new Intent(Intent.ACTION_EDIT);
intent.setType("vnd.android.cursor.item/event");
try{
String [] calendarData = data.getString(0).split(",");
//parse trough calendar start date and time
String [] start = calendarData[4].split("\\s+");
int month = months.get(start[1]);
int day = Integer.parseInt(start[2]);
int year = Integer.parseInt(start[3]);
String [] time = start[4].split(":");
int hour = Integer.parseInt(time[0]);
int minutes = Integer.parseInt(time[1]);
GregorianCalendar date1 =
new GregorianCalendar(year, month, day, hour, minutes);
Log.d("beginTime", "time" +date1.getTime());
//parse trough calendar end date and time
String [] start2 = calendarData[3].split("\\s+");
Log.d("EndTime", start2[1]);
int month2 = months.get(start2[1]);
int day2 = Integer.parseInt(start2[2]);
int year2 = Integer.parseInt(start2[3]);
String [] time2 = start2[4].split(":");
int hour2 = Integer.parseInt(time2[0]);
int minutes2 = Integer.parseInt(time2[1]);
GregorianCalendar date2 =
new GregorianCalendar(year2, month2, day2, hour2, minutes2);
intent.putExtra(Events.TITLE, calendarData[1]);
intent.putExtra(CalendarContract.EXTRA_EVENT_ALL_DAY, true);
intent.putExtra
(CalendarContract.EXTRA_EVENT_BEGIN_TIME, date1.getTimeInMillis());
intent.putExtra
(CalendarContract.EXTRA_EVENT_END_TIME, date2.getTimeInMillis());
intent.putExtra(CalendarContract.EventsEntity.EVENT_LOCATION,
calendarData[5] + calendarData[6] + calendarData[7]);
intent.putExtra
(CalendarContract.EventsEntity.DESCRIPTION, calendarData[8]);
}
catch(Exception e){
Log.d("Error with Calendar Plugins:",e.getMessage());
return false;
}
this.cordova.startActivityForResult(this, intent, 0);
return true;
}
return false;
}
}
历史
- 2013年3月31日:初始版本