2013-04-10 16 views
8

Aplikacja, nad którą pracuję, musi umożliwiać tworzenie wydarzeń w wybranym Kalendarzu, a gdy użytkownik wyświetli te wydarzenia w aplikacji do przeglądania kalendarza, będzie mogła wrócić do mojej aplikacji, aby zobacz więcej informacji na ten temat i związanych z nim danych.Otwieranie aplikacji na Androida z Kalendarza

Za pomocą Calendar Provider Jestem w stanie utworzyć zdarzenia i przechowuję Uri do zdarzenia w celu późniejszego użycia/usunięcia, ale nie znalazłem dobrego sposobu na otwarcie aplikacji z tych zdarzeń w aplikacji do wyświetlania kalendarza.

Dwie opcje, które rozważałem, to uwzględnienie niestandardowego adresu URL w opisie zdarzenia, które po kliknięciu zostanie przechwycone przez filtr zamiany w mojej aplikacji (np. Myapp: // event/1000) lub mogę ustawić CUSTOM_APP_PACKAGE and CUSTOM_APP_URI wartości z CalendarContract podczas tworzenia zdarzenia.

Mój problem z pierwszą opcją jest taki, że nie sądzę, że mogę zagwarantować, że aplikacja do przeglądania kalendarzy poprawnie potraktuje mój niestandardowy URL jako link i niech użytkownik go kliknie (nie działał w kalendarzu Google na mój tablet). Druga opcja wygląda bardziej obiecująco, ale nie udało mi się znaleźć wiele dokumentacji wyjaśniającej, jak z niej korzystać.

Czy ktoś wie, jak prawidłowo to zrobić? Każda pomoc jest doceniana!

+0

Proszę podać informacje. o tym, jak wprowadzono opcję powrotu do aplikacji z Kalendarza? –

+0

Cześć Woestman!Czy możesz przekazać nam informacje na temat mechanizmu implementacji, aby powrócić do aplikacji z Kalendarza, aby wyświetlić więcej informacji na jej temat. –

Odpowiedz

4

Pierwsza z wymienionych opcji działa dobrze na moim Nexusie S. Po prostu wypróbowałem ją teraz, aby upewnić się, że działa poprawnie z domyślnej aplikacji Kalendarz Google.

W moim przypadku nie przechwytywam myapp://event/1000, przechwytywam rzeczywisty adres URL bardziej podobny do https://myspecialdomain.com/blahblah. Przeglądarka zaczyna się ładować, ale zanim zdąży załadować cokolwiek, zostaje zamieniona przez moją aplikację.

Mogę ci pokazać mój kod jutro, jeśli chcesz.

+1

Dziękuję za szybką odpowiedź (chociaż potrzebuję trochę czasu, aby odpowiedzieć). Skończyło się na tym, że użyłem twojej sugestii dla poziomów API poniżej 16, a następnie używając CUSTOM_APP_PACKAGE i CUSTOM_APP_URI dla poziomów API 16 lub wyższych. Chociaż miałem nadzieję, że będzie coś takiego jak CUSTOM_APP_PACKAGE, które działa na niższych poziomach API, byłem zadowolony, słysząc, że Twoja sugestia działa, zanim przejrzałem prace nad jej wdrożeniem. Dzięki! – woestman

+0

@Stephan Im robi dokładnie tak, jak sugerujesz iz jakiegoś powodu otwierana jest tylko przeglądarka. Ten sam filtr intencji działa doskonale po kliknięciu tego samego łącza na wiadomości e-mail, tweety i wiadomości WhatsApp. – AsafK

+0

To jest mój filtr zamiaru. Każdy pomysł, co tu jest nie tak. AsafK

11

Jeśli celowanie w Jelly Bean (API 16+) jest akceptowalne, najlepszym rozwiązaniem będzie użycie CUSTOM_APP_PACKAGE. Podczas dodawania nowego zdarzenia kalendarza, wystarczy wypełnić pola CUSTOM_APP_PACKAGE i CUSTOM_APP_URI (z nazwą pakietu i URI identyfikacji zdarzenia odpowiednio):

ContentValues values = new ContentValues(); 
values.put(CalendarContract.Events.CALENDAR_ID, 1); 
values.put(CalendarContract.Events.TITLE, "Check stackoverflow.com"); 
values.put(CalendarContract.Events.DTSTART, beginTime.getTimeInMillis()); 
values.put(CalendarContract.Events.DTEND, endTime.getTimeInMillis()); 
values.put(CalendarContract.Events.EVENT_TIMEZONE, TimeZone.getDefault().getID()); 

values.put(CalendarContract.Events.CUSTOM_APP_PACKAGE, getPackageName()); 
values.put(CalendarContract.Events.CUSTOM_APP_URI, "myAppointment://1"); 

getContentResolver().insert(CalendarContract.Events.CONTENT_URI, values);  

Następnie trzeba określić jako część AndroidManifest.xml (jak wyjaś nia the documentation) Aktywność, która zostanie wywołana z aplikacji Kalendarz, aby wyś wietlić widok szczegółowy, np.

<activity android:name=".ShowCalendarDetailActivity"> 
     <intent-filter> 
      <action android:name="android.provider.calendar.action.HANDLE_CUSTOM_EVENT" /> 
      <category android:name="android.intent.category.DEFAULT" /> 
      <data android:mimeType="vnd.android.cursor.item/event" /> 
     </intent-filter>    
    </activity> 

ShowCalendarDetailActivity zostanie uruchomiony, gdy dotknięcie przycisku, który się pojawi, i zostaną przekazane z zamiarem działania "android.provider.calendar.action.HANDLE_CUSTOM_EVENT" i jego URI będzie element kalendarza URI.

Niestandardowy URI, który dostarczyłeś, znajduje się w dodatkach, z kluczem CalendarContract.EXTRA_CUSTOM_APP_URI.

@Override 
protected void onCreate(Bundle savedInstanceState) 
{ 
    super.onCreate(savedInstanceState); 
    String myCustomUri = getIntent().getStringExtra(CalendarContract.EXTRA_CUSTOM_APP_URI); 

    ... 
} 

Jeśli chcesz spojrzeć na kod, gdzie aplikacja Kalendarz buduje tę intencję, zobacz EventInfoFragment.updateCustomAppButton() w EventInfoFragment.java.

+0

Nie udało mi się jeszcze uruchomić, ponieważ nie ma przycisku do otwarcia Aplikacja wyświetla się w kalendarzu. Używam tylko intencji (z CUSTOM_APP_PACKAGE i CUSTOM_APP_URI w dodatkach), a nie dostawcy Kalendarza ... czy to też powinno być możliwe, czy muszę zmienić dostawcę kalendarza? – friday

+0

Witam @friday Nie testowałem tego, ale miałem inne problemy z użyciem intencji zamiast dostawców treści (na przykład podczas dodawania kontaktów). Więc nie byłbym zaskoczony, gdyby to nie zadziałało ...: / – matiash

0

@matiash, jak to zrobić za pomocą apara Google Calendar.

values.put(CalendarContract.Events.CUSTOM_APP_PACKAGE, getPackageName()); 
values.put(CalendarContract.Events.CUSTOM_APP_URI, "myAppointment://1"); 
Powiązane problemy