2012-01-16 9 views
10

Androidのカレンダーアプリは、ローカルの電話カレンダー、Googleカレンダーなど、複数の別々のカレンダーをマージできます。Androidに新しい電話カレンダーを追加するにはどうすればよいですか?

Android携帯にどのように新しいカレンダーを追加できますか? Googleのようなオンラインリソースにアクセスすることなく、そのカレンダーでイベントを動的に生成したいと考えています。

編集:Android 1.5および2.3.4の携帯電話をサポートしたいと思います。私はおそらく新しい電話のためのいつか4.0のアップデートを得るでしょうが、それがいつあるかを知っています...

+0

ICSにGoogleカレンダー上でそれを作成することです:あなたはcom.android.calendar権限の同期アダプタを実装し、CalendarContractの行を作成する必要があります.Calendarここで、ACCOUNT_NAMEとACCOUNT_TYPEをあなたの名前と値に設定します。 2の機能3とそれ以前のバージョンは未公開ですが、同じことについては*動作していますが、それよりも後方の相互運用性はそれほど厳しくなく、テストに時間がかかります。 – Jens

答えて

3

私はthis linkで、4.0より前の電話機でカレンダーコンテンツプロバイダにアクセスする方法について説明しています。

は、基本的にはあなただけのプロバイダのURI文字列を知っている必要があります:

  • content://calendar Android用アンドロイド< 2.2
  • content://com.android.calendarのために2.2以降。
3

私はカレンダー(同期されていない)を挿入するために、 APIレベル15エミュレータ(カレンダーアプリには、携帯電話(API 8)のアプリとは違うカレンダーを追加する機能がないため、見つからなかったため)...)。レイアウトには、カレンダーの名前と表示名のテキストフィールド、追加ボタン、挿入後にフィードバックを与えるステータステキストビューが必要です。 あなたがマニフェストに設定された権限を持っていることを確認してください:

public class CalUtilActivity extends Activity { 
private EditText name; 
private EditText display; 
private TextView status; 

@Override 
public void onCreate(final Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    this.setContentView(R.layout.main); 

    this.name = (EditText) this.findViewById(R.id.name); 
    this.display = (EditText) this.findViewById(R.id.displayname); 
    this.status = (TextView) this.findViewById(R.id.status); 

    final Button b = (Button) this.findViewById(R.id.add); 
    b.setOnClickListener(new OnClickListener() { 
     @Override 
     public void onClick(final View v) { 
      CalUtilActivity.this.addCalendar(); 
     } 
    }); 
} 

private void addCalendar() { 
    final String cname = this.name.getText().toString(); 
    final String dname = this.display.getText().toString(); 
    if(cname.length() == 0 || dname.length() == 0) { 
     this.status.setText(this.getResources().getString(R.string.errorNames)); 
     return; 
    } 
    this.status.setText(""); 

    final Uri calUri = CalendarContract.Calendars.CONTENT_URI; 
    final ContentValues v = new ContentValues(); 
    v.put(CalendarContract.Calendars.NAME, cname); 
    v.put(CalendarContract.Calendars.CALENDAR_DISPLAY_NAME, dname); 
    v.put(CalendarContract.Calendars.VISIBLE, 1); 

    final Uri result = this.getContentResolver().insert(calUri, v); 

    this.status.setText(result.toString()); 
} 

}

API 13について、あなたはコンテンツプロバイダを使用することはできません前に、あなたがする必要があります。ここでは

<uses-permission android:name="android.permission.WRITE_CALENDAR"/> 
<uses-permission android:name="android.permission.READ_CALENDAR"/> 

コードありありデータベースに直接アクセスします。カレンダーを追加するには、_id、名前を設定作成するには、次の文

CREATE TABLE Calendars (_id INTEGER PRIMARY KEY,_sync_account TEXT,_sync_account_type TEXT,_sync_id TEXT,_sync_version TEXT,_sync_time TEXT,_sync_local_id INTEGER,_sync_dirty INTEGER,_sync_mark INTEGER,url TEXT,name TEXT,displayName TEXT,hidden INTEGER NOT NULL DEFAULT 0,color INTEGER,access_level INTEGER,selected INTEGER NOT NULL DEFAULT 1,sync_events INTEGER NOT NULL DEFAULT 0,location TEXT,timezone TEXT,ownerAccount TEXT, organizerCanRespond INTEGER NOT NULL DEFAULT 1); 

に従って定義されたテーブルのカレンダー、に行を追加しなければならない、とカレンダーを同期する必要がない場合DisplayNameが動作するはずです。ただし、カレンダーアプリとそのデータベースがないため、エミュレーターでテストすることはできません。また、デバイスベンダーは理論的にデータベースを変更した可能性がありますが、カレンダーアプリケーションが多数使用されているため、私は個人的にはデータベーススキーマを変更していないと思います。

13

ICSの新しいAPIを使用してカレンダーを追加できたばかりです。 Stefanの答えは役に立ちましたが、すべての列に書き込むには、同期アダプタとして操作する必要があります。 CalendarContract.ACCOUNT_TYPE_LOCALを使用して通常のアプリからこれを行うことができます。次のコードはICSで動作するはずです。たぶん一部の列の値が正しくない可能性があります。 CalendarContract.Calendarsのドキュメントを確認してください。残念ながら古いAndroidバージョンではお手伝いできませんが、CalendarContractは定数の文字列値にのみ使用されます。たぶん古いバージョンでも動作します。

Uri calUri = CalendarContract.Calendars.CONTENT_URI; 
ContentValues cv = new ContentValues(); 
cv.put(CalendarContract.Calendars.ACCOUNT_NAME, yourAccountName); 
cv.put(CalendarContract.Calendars.ACCOUNT_TYPE, CalendarContract.ACCOUNT_TYPE_LOCAL); 
cv.put(CalendarContract.Calendars.NAME, yourInternalName); 
cv.put(CalendarContract.Calendars.CALENDAR_DISPLAY_NAME, yourDisplayName); 
cv.put(CalendarContract.Calendars.CALENDAR_COLOR, yourColor); 
cv.put(CalendarContract.Calendars.CALENDAR_ACCESS_LEVEL, CalendarContract.Calendars.CAL_ACCESS_OWNER); 
cv.put(CalendarContract.Calendars.OWNER_ACCOUNT, true); 
cv.put(CalendarContract.Calendars.VISIBLE, 1); 
cv.put(CalendarContract.Calendars.SYNC_EVENTS, 1); 

calUri = calUri.buildUpon() 
    .appendQueryParameter(CalendarContract.CALLER_IS_SYNCADAPTER, "true") 
    .appendQueryParameter(CalendarContract.Calendars.ACCOUNT_NAME, ACCOUNT_NAME) 
    .appendQueryParameter(CalendarContract.Calendars.ACCOUNT_TYPE, CalendarContract.ACCOUNT_TYPE_LOCAL) 
    .build(); 
Uri result = this.getContentResolver().insert(calUri, cv); 
+0

+1それは私をたくさん助け、非常に感謝します。 – Andrain

-5

最も簡単には、お使いのコンピュータと同期して

+8

あなたは私を笑わせてくれました:) ...少なくとも、それは冗談だと思っています。 – Glenn85

関連する問題