65.9K
CodeProject 正在变化。 阅读更多。
Home

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

starIconstarIconstarIconstarIcon
emptyStarIcon
starIcon

4.81/5 (5投票s)

2013 年 4 月 1 日

CPOL

3分钟阅读

viewsIcon

23796

本文将向您展示如何在混合型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"/>

config - Click to enlarge image

创建一个名为“`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日:初始版本
© . All rights reserved.