PhoneGap/Cordova日历集成(Android)

4
我正在使用PhoneGap(也称为Cordova)构建Android应用程序,并且在尝试集成日历时遇到了麻烦。免责声明:我对Android和PhoneGap都不太懂,请多包涵。
我想要做的就是添加一个事件到用户的日历中。按照这篇教程,我创建了一个插件来启动一个日历Intent。代码如下:
public class CalendarPlugin extends Plugin {
public static final String NATIVE_ACTION_STRING="addToCalendar"; 
public static final String SUCCESS_PARAMETER="success"; 

@Override
public PluginResult execute(String action, JSONArray data, String callbackId) {
    if (NATIVE_ACTION_STRING.equals(action)) { 
        Calendar beginTime = Calendar.getInstance();
        beginTime.set(2012, 6, 19, 7, 30);
        Calendar endTime = Calendar.getInstance();
        endTime.set(2012, 6, 19, 8, 30);

        Intent calIntent = new Intent((Context) this.ctx, CalendarPlugin.class)
            .setAction(Intent.ACTION_INSERT)
            .putExtra(Events.TITLE, "A new event")
            .putExtra(CalendarContract.EXTRA_EVENT_ALL_DAY, true)
            .putExtra(CalendarContract.EXTRA_EVENT_BEGIN_TIME, beginTime.getTimeInMillis())
            .putExtra(CalendarContract.EXTRA_EVENT_END_TIME, endTime.getTimeInMillis());

        this.ctx.startActivity(calIntent);
        return new PluginResult(PluginResult.Status.OK, "Smashing success");
    }

return new PluginResult(PluginResult.Status.ERROR, "Didn't work bro");
}
}

调用这个插件的Javascript代码是标准的:

var CalendarPlugin = { 
    callNativeFunction: function (success, fail, resultType) { 
        if (cordova) {
            return cordova.exec( success, fail, 
                "org.myorg.appname.CalendarPlugin", 
                "addToCalendar", [resultType]);
        }
        else {
            alert("Calendar function is not available here.");
        }
    } 
};

Android代码被调用了(使用断点确认)。但是返回给Javascript代码的结果是一个错误:
“无法找到明确的活动类{org.myorg.appname/org.myorg.appname.CalendarPlugin};您是否在AndroidManifest.xml中声明了此活动?”
教程中没有提到要添加到AndroidManifest.xml,这让我相信我漏掉了什么(而且,CalendarPlugin代码已经成功调用,那么怎么会出现找不到CalendarPlugin类的错误呢?)如果确实需要将CalendarPlugin添加到清单中,我该怎么做呢?
2个回答

5
教程中提到的内容没有涉及到意图。您要发送数据的意图是您自己的CalendarPlugIn类,这不是您想要的,因为它不能处理意图。
请参考有关意图的文档:http://developer.android.com/guide/topics/intents/intents-filters.html 此外,如果您在SO上搜索,您会发现在ICS之前,甚至没有一种官方的方式可以将东西添加到Google Calendar,而不使用Web服务。虽然有非官方的方法,但它们受制于Google或ODMs本身的怪癖。
更新:
您应该能够通过插件在Phonegap中使用意图。我只是加了一条评论来指出,如果您想要在应用程序中集成日历,那么您可能需要做一些研究,以支持大多数Android设备。如果您有兴趣在ICS中添加日历事件,请查看:http://developer.android.com/reference/android/provider/CalendarContract.html 编辑者补充:
我只需要修复“Intent”构造函数,并且这个解决方案按预期工作:
Uri uri = Uri.parse("content://com.android.calendar/events");
Intent calIntent = new Intent("android.intent.action.INSERT", uri)

那么你认为我的方法在ICS及以上版本上可行吗?从Phonegap插件中使用Intents是否可能? - McGarnagle
谢谢 - 你提到 Intent 的观点让我找对了方向。(另外,希望你不介意,我只是为了完整度修改了你的回答。) - McGarnagle
@dbaseman 不用在意。只是要意识到这不是官方支持的意图。 - Morrison Chang
1
你的意思是它只在ICS及以上版本中得到官方支持吗?我查看了一些文档,这些文档表明某种意义上它得到了官方支持:http://developer.android.com/guide/topics/providers/calendar-provider.html#intent-insert - McGarnagle
正确。我的错。根据您提供的链接,仅在ICS及以上版本中才得到官方支持。 - Morrison Chang
@Jitu 不是,但我会在接下来的几周里处理它--如果我找到了任何信息,我会在这里发布答案。 - McGarnagle

0

为了使其适用于所有Android SDK版本,请尝试以下代码

 Intent intent = new Intent(Intent.ACTION_EDIT);
 intent.setType("vnd.android.cursor.item/event");

我试过了,它对我有效。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接