2012-02-17 10 views
4

ICSの新しいカレンダーコンテンツプロバイダを使用してカレンダーを作成しようとしています。カレンダーの作成のみSyncAdapterで行うことができるので、私は1つを作成しました: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(); 
    } 
} 

しかし、私はどこにでも見られるような、私が望むすべてが新しいを挿入するためにそれを使用することですので、それは、サービス内で実行されません。カレンダー。サービスでの実行は必須ではありませんか?そうではないようです。

とにかく、私は私の活動でそれをインスタンス化し、私のメソッドを呼び出す:それは成功し、苦情を実行

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は、同期アダプタを実行するときにサービスを呼び出します。

同期アダプタはAndroidシステム、特にアプリケーションではなく、SyncManagerによって制御されます。

SampleSyncAdapterサンプルアプリケーションでは、同期アダプタとサービスを書き込む方法を示しています。認証をしたくない場合は、その部分を削除することができます。 AbstractThreadedSyncAdapterを継承するクラスと、それにバインドするServiceクラスを、同期アダプタのXMLファイルと共に実装するだけです。

良い答えは です。同期アダプタは、サーバとデバイスの間でデータを同期させるのに役立ちます。サーバーからデバイスにカレンダーデータをダウンロードするだけであれば、サーバーからデータをスクラップしてカレンダープロバイダーに書き込むアプリケーションを使用できます。それは同期ではありません。これ以上ダウンロードやアップロードを行うつもりはありません。あなたはが同期して2つのデータソースを保存しておきたいん場合はもちろん、同期アダプタは、これらの利点があります。

  • システムは、ユーザーの介入なしに、定期的にそれを実行します。
  • システムは、同期を実行する前にネットワークが使用可能であることを確認します。ただし、ネットワークサービスがオフラインのときにサーバーに対して認証しようとするなど、システムがダムを実行することを防ぐことはできません。
  • システムは、同期を開始したときに、同じサーバーおよびコンテンツプロバイダに対して他の同期が実行されていないことを確認します。
  • システムは、ユーザがアカウントを追加したいときに使用可能な同期アダプタを表示するための標準的な機能を提供します。
+0

ありがとうございました!ええ、私がやっていることは、Googleカレンダーで新しいカレンダーを作成することでした。悲しいことに、このアクションは新しいGoogleカレンダープロバイダではサポートされていません。私が知る限り、かなりウェブサイトのデスクトップ版を通してそれを行う必要があります。 – Adam

+1

@Adamを2014年とすると、公式のGoogleカレンダーアプリでさえもこの機能はありません。カレンダーを作成するには、Webアプリを使用する必要があります。この状況は、Joeが何を意味するのかを確認します。同期アダプタは、同期タスクを実行するためのもので、これ以上のものはありません。この場合、カレンダーの作成は、APIのより良い場所を見つけることができなかった機能です –

2

はい、カレンダーAPIは新しいカレンダーの作成には適していません。このデバイスは、雲の鏡のようなものです。

0

AndroidカレンダーAPIを使用してプログラムで既存のGoogle(Gmail)アカウントに新しい同期可能なカレンダーを作成することはできません。私はここに詳細を入れます:https://stackoverflow.com/a/19734278/237232

関連する問題