4

Я создаю приложение для Android с помощью PhoneGap (иначе Кордовы), и у меня возникают проблемы с интеграцией календаря. Отказ от ответственности: Я обоюдный Android и PhoneGap, пожалуйста, несите меня.Интеграция с календарем PhoneGap/Cordova (Android)

Все, что я пытаюсь сделать, это добавить событие в календарь пользователя. После this tutorial, я создал плагин, который пытается запустить Календарное намерение. Код выглядит следующим образом:

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 ошибка:

Unable to find explicit activity class {org.myorg.appname/org.myorg.appname.CalendarPlugin}; have you declared this activity in your AndroidManifest.xml?

Там нет упоминания о добавлении к AndroidManifest.xml в учебнике, что приводит меня к мысли, что я что-то не хватает (кроме того, CalendarPlugin код запускается успешно, так как может быть ошибка, указывающая, что класс CalendarPlugin не найден?). Если действительно мне нужно добавить CalendarPlugin в манифест, как бы я это сделал?

ответ

5

Упомянутый урок не охватывает намерения. Цель, по которой вы отправляете свои данные, - это ваш собственный класс CalendarPlugIn, который не является тем, что вы хотите, поскольку он не справляется с намерением.

См. http://developer.android.com/guide/topics/intents/intents-filters.html относительно намерений.

Также, если вы будете искать вокруг SO, вы обнаружите, что до тех пор, пока ICS не сможет даже официально добавить вещи в Календарь Google, не используя веб-службу. Есть способы сделать это неофициально, но они подчиняются прихотям Google или самим ODM.

Обновлен:

Вы должны быть в состоянии использовать намерение с PhoneGap (через плагин). Я добавил только комментарий, чтобы отметить, что если вы планируете использовать интеграцию с календарем в своем приложении, вам, вероятно, придется немного научиться, если вы хотите поддерживать большинство Android-устройств. Если вы заинтересованы в добавлении события календаря в ICS смотрите на: http://developer.android.com/reference/android/provider/CalendarContract.html

Op Править

Мне просто нужно, чтобы исправить Intent конструктор, и это работает, как ожидалось:

Uri uri = Uri.parse("content://com.android.calendar/events"); 
Intent calIntent = new Intent("android.intent.action.INSERT", uri) 
+0

Как вы думаете, мой подход возможен даже на ICS и выше? Возможно ли работать с Intents из плагинов Phonegap? – McGarnagle

+0

@dbaseman см. Мой обновленный ответ –

+0

Спасибо, что ваша точка зрения о намерении указала мне в правильном направлении. (Кроме того, я надеюсь, что вы не возражаете, я только исправил ваш ответ за полноту.) – McGarnagle

0

Для того, чтобы заставить его работать для всех версий Android sdk, попробуйте следующий код:

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

Я попробовал работать для меня.

Смежные вопросы