Tôi đã viết hoạt động sau (cộng với một số tài nguyên, v.v.) để chèn lịch (không đồng bộ hóa) trên trình mô phỏng API cấp 15 (vì ứng dụng lịch không có tính năng để thêm lịch không giống như ứng dụng trên điện thoại của tôi (API 8) hoặc tôi không tìm thấy nó ...). Bố cục phải có các trường văn bản cho tên và tên hiển thị của lịch, nút thêm và chế độ xem văn bản trạng thái để cung cấp phản hồi sau khi chèn. Đảm bảo bạn có các điều khoản quy định trong biểu hiện:
<uses-permission android:name="android.permission.WRITE_CALENDAR"/>
<uses-permission android:name="android.permission.READ_CALENDAR"/>
Dưới đây là Code:
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());
}
}
Đối với API 13 và trước khi bạn không thể sử dụng các nhà cung cấp nội dung, bạn cần phải truy cập cơ sở dữ liệu trực tiếp. Để thêm một lịch bạn phải thêm một hàng vào bảng Calendars, được xác định theo các tuyên bố sau tạo
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);
Thiết lập _id, tên và displayName nên làm việc nếu bạn không cần phải đồng bộ hóa lịch. Tuy nhiên, bạn không thể thử nghiệm trên trình mô phỏng, vì ứng dụng lịch và cơ sở dữ liệu của nó bị thiếu. Và các nhà cung cấp thiết bị có thể đã sửa đổi cơ sở dữ liệu về mặt lý thuyết, nhưng vì có rất nhiều ứng dụng lịch có sẵn, cá nhân tôi không nghĩ rằng họ đã sửa đổi lược đồ cơ sở dữ liệu.
ICS: Bạn sẽ cần phải thực hiện một bộ chuyển đổi đồng bộ cho các cơ quan com.android.calendar và tạo ra một hàng trong CalendarContract .Chi tiết nơi bạn đặt ACCOUNT_NAME và ACCOUNT_TYPE thành tên và giá trị của bạn. Các chức năng cho 2.3 và trước đó là chưa được công bố, nhưng hoạt động ... * về * tương tự - nhưng sẽ cho khả năng tương tác ngược hơn nữa là sẽ lộn xộn và tốn thời gian để kiểm tra. – Jens