2012-01-16 34 views
10

Ứng dụng lịch trên Android có thể hợp nhất nhiều lịch riêng biệt: lịch điện thoại cục bộ, lịch Google, v.v.Tôi làm cách nào để thêm lịch điện thoại mới vào Android?

Làm cách nào để thêm lịch mới vào điện thoại Android? Tôi muốn tự động tạo các sự kiện trong lịch đó mà không truy cập bất kỳ tài nguyên trực tuyến nào như Google.

Chỉnh sửa: Tôi muốn hỗ trợ điện thoại với Android 1.5 và 2.3.4. Tôi có thể sẽ nhận được bản cập nhật lên 4.0 cho điện thoại mới hơn vào một ngày nào đó nhưng ai sẽ biết khi nào ...

+0

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

Trả lời

3

Tôi đã tìm thấy this link thảo luận về việc truy cập nhà cung cấp nội dung Lịch trên điện thoại trước 4.0.

Về cơ bản bạn chỉ cần phải biết chuỗi URI cho các nhà cung cấp:

  • content://calendar dành cho Android 2.2 <
  • content://com.android.calendar dành cho Android 2.2 +.
3

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.

13

Tôi vừa quản lý để thêm Lịch bằng API mới từ ICS. Câu trả lời của Stefan đã giúp, nhưng để có thể viết cho tất cả các cột, bạn phải thực hiện thao tác như một bộ điều hợp đồng bộ. Bạn có thể làm điều này từ một ứng dụng thông thường bằng cách sử dụng CalendarContract.ACCOUNT_TYPE_LOCAL. Mã sau đây sẽ hoạt động trên ICS. Có thể một số giá trị cột không đúng. Xem tài liệu của CalendarContract.Calendars. Thật không may tôi không thể giúp bạn cho các phiên bản Android cũ hơn, nhưng CalendarContract chỉ được sử dụng cho một số giá trị chuỗi không đổi. Có lẽ những điều này cũng hoạt động trên các phiên bản cũ hơn.

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 nó giúp tôi rất nhiều, cảm ơn bạn rất nhiều. – Andrain

-5

Các đơn giản nhất là để tạo ra nó trên google lịch trên máy tính và đồng bộ hóa nó

+8

Bạn đã làm tôi cười :) ... Ít nhất, tôi hy vọng nó có nghĩa là một trò đùa. – Glenn85

Các vấn đề liên quan