3

カスタム Android アプリケーションを使用して、既存の Google アカウントに新しいカレンダーを作成します。ここのスタック オーバーフローにあるいくつかのチュートリアルに従って、メイン アクティビティ (イベントの読み取りと管理を行う場所)、サービス ファイル (CalendarService と呼ばれる)、および SyncAdapter で構成されるアプリケーションを作成しました。メイン アクティビティでは、インテントを使用してサービスを初期化しました。

private Intent calendarServiceIntent;
...
calendarServiceIntent = new Intent(getApplicationContext(), CalendarService.class);
startService(calendarServiceIntent);

次に、この方法でサービスを実装しました。

public class CalendarService extends Service{

//private static final Object sSyncAdapterLock = new Object();

private static CalendarSyncAdapter sSyncAdapter = null;

@Override
public void onCreate() {
    super.onCreate();
    //synchronized (sSyncAdapterLock) {
        if (sSyncAdapter == null) {
            System.out.println("SERVICE STARTED ON CREATE");
            sSyncAdapter = new CalendarSyncAdapter(getApplicationContext(), true); 
        }
   // }
}

@Override
public IBinder onBind(Intent intent) {
    System.out.println("SERVICE STARTED BINDER");
    return sSyncAdapter.getSyncAdapterBinder();
}

}

次に、クラス 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) {
    Uri calUri = CalendarContract.Calendars.CONTENT_URI;
      ContentValues cv = new ContentValues();
      cv.put(CalendarContract.Calendars.ACCOUNT_NAME, "mygoogleaccount@gmail.com");
      cv.put(CalendarContract.Calendars.ACCOUNT_TYPE, CalendarContract.ACCOUNT_TYPE_LOCAL);
      cv.put(CalendarContract.Calendars.NAME, "MyCalendar");
      cv.put(CalendarContract.Calendars.CALENDAR_DISPLAY_NAME, "MyCalendar");
      cv.put(CalendarContract.Calendars.CALENDAR_COLOR, Color.RED);
      cv.put(CalendarContract.Calendars.CALENDAR_ACCESS_LEVEL, CalendarContract.Calendars.CAL_ACCESS_OWNER);
      cv.put(CalendarContract.Calendars.OWNER_ACCOUNT, "mygoogleaccount@gmail.com");
      cv.put(CalendarContract.Calendars.VISIBLE, 1);
      cv.put(CalendarContract.Calendars.SYNC_EVENTS, 1);

      ContentResolver cr = getContext().getContentResolver();

      Uri creationUri = asSyncAdapter(Calendars.CONTENT_URI, "mygoogleaccount@gmail.com", CalendarContract.ACCOUNT_TYPE_LOCAL );
      Uri created = cr.insert( creationUri, cv );

}



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

これはxmlファイルの一部です

<service android:name=".CalendarService"
android:exported="true">
<intent-filter>
<action android:name="android.content.CalendarSyncAdapter" />
</intent-filter>
<meta-data
android:name="android.content.CalendarSyncAdapter"
android:resource="@xml/calendar_sync_adapter" />
</service> 

これは関連する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"
/>

明らかに、これはすべて機能せず、メイン アクティビティのコード (メソッド「onPeformSync」内) を移動した場合にのみ、新しいカレンダーが作成されます。syncAdapter を使用して新しいカレンダーを作成する正しい解決策はどれですか? 最後に疑問: 新しいカレンダーを Google カレンダーと同期する可能性はありますか? 前もって感謝します

4

0 に答える 0