2012-02-17 6 views
4

ICS의 새로운 캘린더 용 콘텐츠 공급자를 사용하여 캘린더를 만들려고합니다.Android 4.0 (ICS) 콘텐츠 공급자로 캘린더 만들기

public class CalendarSyncAdapter extends AbstractThreadedSyncAdapter 
{ 

    public CalendarSyncAdapter(Context context, boolean autoInitialize) 
    { 
     super(context, autoInitialize); 
    } 

    @Override 
    public void onPerformSync(Account account, Bundle extras, String authority, ContentProviderClient provider, SyncResult syncResult) 
    { 
     Log.i(Debug.TAG, "onPerformSync()"); 
    } 

    public void doCreateCalendar(Account account) 
    { 
      ContentResolver cr = getContext().getContentResolver(); 

      ContentValues values = new ContentValues(); 
      values.put(Calendars.ACCOUNT_NAME, account.name); 
      values.put(Calendars.ACCOUNT_TYPE, account.type); 
      values.put(Calendars.NAME, "newesttest"); 
      values.put(Calendars.CALENDAR_DISPLAY_NAME, "newestTest"); 
      values.put(Calendars.CALENDAR_COLOR, 0xFFFFFFFF); 
      values.put(Calendars.CALENDAR_ACCESS_LEVEL, Calendars.CAL_ACCESS_OWNER); 
      values.put(Calendars.OWNER_ACCOUNT, account.name); 

      values.put(Calendars.SYNC_EVENTS, 1); 
      values.put(Calendars.VISIBLE, 1); 

      Uri creationUri = asSyncAdapter(Calendars.CONTENT_URI, account.name, account.type); 
      Uri created = cr.insert(creationUri, values); 
      long id = Long.parseLong(created.getLastPathSegment()); 

      Log.i(Debug.TAG, "Calendar created: " + id + " - " + created); 
    } 

    private Uri asSyncAdapter(Uri uri, String account, String accountType) 
    { 
     return uri.buildUpon() 
     .appendQueryParameter(CalendarContract.CALLER_IS_SYNCADAPTER,"true") 
     .appendQueryParameter(Calendars.ACCOUNT_NAME, account) 
     .appendQueryParameter(Calendars.ACCOUNT_TYPE, accountType).build(); 
    } 
} 

을하지만 어디에서나 볼처럼 내가 원하는 모든 새를 삽입하는 데 사용하는 것입니다 이후는 서비스 내에서 실행되지 않습니다 달력 생성이 만 SyncAdapter에서 수행 할 수 있기 때문에, 나는 하나를 만들었습니다 달력. 서비스 실행은 필수 항목이 아닙니까? 있을 것 같지 않습니다.

어쨌든, 나는 나의 활동에 인스턴스를 내 메서드를 호출 : 그것은 성공적으로 불만 실행

public void createCalendar(View v) 
{ 
    m_syncAdapter.doCreateCalendar(this, m_account); 
} 

을하지만 반환하는 URI는 항상 동일합니다. 행 ID에 대해 구문 분석 할 때 항상 12입니다. 그리고 내 일정을 확인할 때 새로운 것은 없습니다.

... 

<application 

... 

    <activity android:name="Setup" android:label="@string/activity_title_setup"> 
     <intent-filter> 
      <action android:name="android.content.SyncAdapter" /> 
     </intent-filter> 
     <meta-data android:name="android.content.SyncAdapter" android:resource="@xml/calendar_sync_adapter" /> 
    </activity> 

그리고 calendar_sync_adapter.xml :

<?xml version="1.0" encoding="utf-8"?> 
<sync-adapter xmlns:android="http://schemas.android.com/apk/res/android" 
    android:contentAuthority="com.android.calendar" 
    android:accountType="com.google" 
    android:userVisible="true" 
/> 

내가 여기에 잘못하고 있어요 그래서하지 않도록 무엇을 내 매니페스트에서

나는 모든 설정을 가지고있다.

02-17 16:43:07.783: I/ActivityManager(184): Start proc com.android.providers.calendar for content provider com.android.providers.calendar/.CalendarProvider2: pid=20132 uid=10008 gids={3003, 1015} 
02-17 16:43:07.806: I/ActivityThread(20132): Pub com.android.calendar: com.android.providers.calendar.CalendarProvider2 
02-17 16:43:07.869: I/ActivityManager(184): Start proc com.google.android.calendar for service com.google.android.calendar/com.google.android.syncadapters.calendar.CalendarSyncAdapterService: pid=20145 uid=10007 gids={3003} 
02-17 16:43:07.900: I/ActivityThread(20145): Pub com.google.android.calendar.CalendarRecentSuggestionsProvider: com.android.calendar.CalendarRecentSuggestionsProvider 

// This is my print of the returned URI 
02-17 16:43:08.009: I/C3(19995): Calendar created: 12 - content://com.android.calendar/calendars/12?caller_is_syncadapter=true&account_name=xxx%40gmail.com&account_type=com.google 

02-17 16:43:08.876: I/CalendarProvider2(20132): Sending notification intent: Intent { act=android.intent.action.PROVIDER_CHANGED dat=content://com.android.calendar } 
02-17 16:43:08.876: W/ContentResolver(20132): Failed to get type for: content://com.android.calendar (Unknown URL content://com.android.calendar) 

답변

3

즉각적인 대답은 : 동기화 어댑터는 서비스와 연결해야하지만 내가 그것을 실행할 때 내가 로그에서 볼 것입니다. 서비스는 onCreate()에서 동기화 어댑터를 인스턴스화하고 onBind()의 동기화 어댑터에 IBinder를 반환합니다. SyncManager는 동기화 어댑터를 실행하려고 할 때 서비스를 호출합니다.

동기화 어댑터는 안드로이드 시스템, 특히 응용 프로그램이 아니라 SyncManager에 의해 제어됩니다.

SampleSyncAdapter 샘플 앱은 동기화 어댑터 및 서비스를 작성하는 방법을 보여줍니다. 인증을 원하지 않으면 해당 부분을 삭제할 수 있습니다. AbstractThreadedSyncAdapter와이를 바인딩하는 Service 클래스를 확장하는 클래스와 함께 동기화 어댑터의 XML 파일을 구현하면됩니다.

더 좋은 대답은 입니다. 동기화 어댑터를 사용하면 서버와 장치간에 데이터를 동기화 할 수 있습니다. 서버에서 장치로 캘린더 데이터를 다운로드하려는 경우 서버에서 데이터를 스크랩 한 응용 프로그램을 사용하여 달력 공급자에게 씁니다. 그것은 동기화가 아닙니다. 더 이상 다운로드 나 업로드를하지 않을 것이라는 보장은 없습니다. 당신이 동기화에있는 두 개의 데이터 소스를 유지하려면 할 물론, 만약 동기화 어댑터는 다음과 같은 장점이 있습니다

  • 이 시스템은 사용자의 개입없이 정기적으로 실행됩니다.
  • 시스템은 동기화를 실행하기 전에 네트워크를 사용할 수 있는지 확인합니다. 하지만 시스템이 네트워크 서비스가 오프라인 일 때 서버에 대해 인증을 시도하는 것처럼 바보 같은 일을하지 못하게 할 수는 없습니다.
  • 동기화를 시작할 때 동일한 서버 및 콘텐츠 공급자에 대해 다른 동기화가 실행되지 않도록 시스템에서 보장합니다.
  • 시스템은 사용자가 계정을 추가하려고 할 때 사용할 수있는 동기화 어댑터를 표시하는 표준 기능을 제공합니다.
+0

응답 해 주셔서 감사합니다. 예, 내가하려는 것은 Google 캘린더에 새 캘린더를 만드는 것입니다. 안타깝게도 Sync Adapters는 다음과 같은 점을 지적합니다. P 슬프게도이 작업은 새 Google 캘린더 제공 업체에서 지원하지 않습니다. 내가 말할 수있는 한 꽤 많이 웹 사이트의 데스크톱 버전을 통해해야합니다. – Adam

+1

@ Adam, 2014 년 공식 Google 캘린더 앱에도이 기능이 없습니다. 달력을 만들려면 웹 응용 프로그램을 사용해야합니다. 이 상황은 Joe가 의미하는 바를 확인합니다. 동기화 어댑터는 동기화 작업을 수행하기위한 것이지 아무 것도 없습니다.이 경우 캘린더 생성은 API에서 더 나은 위치를 찾지 못한 기능인 것 같습니다. –

2

예, 캘린더 API는 새 캘린더를 만드는 데 적합하지 않습니다. 이 장치는 클라우드의 모습을 더 많이 반영합니다.

0

Android 캘린더 API를 사용하여 프로그래밍 방식으로 기존 Google (Gmail) 계정에 새로운 동기화 가능한 캘린더를 만들 수 없습니다. 자세한 내용은 여기에 있습니다. https://stackoverflow.com/a/19734278/237232