html5 canvas

|

1. Canvas 태그 선언

  - 2d 드로잉을 할 경우 태그 선언과 스크립트 사용

  - 태그는 id, 높이, 넒이 속성 정의 함

  - 크롬,파이어폭스,사파리,오페라에서는 지원하나, IE8 까지는 지원하지 않고, IE9에서는 플러그인 형태로 일부 지원함


<html>

 <head>

  <script type="application/javascript">

    function draw() {

      var canvas = document.getElementById("canvas");

      if (canvas.getContext) {

        var ctx = canvas.getContext("2d");


        ctx.fillStyle = "rgb(200,0,0)";

        ctx.fillRect (10, 10, 55, 50);


        ctx.fillStyle = "rgba(0, 0, 200, 0.5)";

        ctx.fillRect (30, 30, 55, 50);

      }

    }

  </script>

 </head>

 <body onload="draw();">

   <canvas id="canvas" width="150" height="150"></canvas>

 </body>

</html>



2. Canvas 예제

  - 선그리기

    - cxt.moveTo(10,10);

    - cxt.lineTo(150,50);

    - cxt.stroke();

  - 원그리기

    - cxt.fillStyle="#FF0000";

    - cxt.beginPath();

    - cxt.arc(70,18,15,0,Math.PI*2,true);

    - cxt.closePath();

    - cxt.fill();

  - 그라데이션

    - var grd=cxt.createLinearGradient(0,0,175,50);

    - grd.addColorStop(0,"#FF0000");

    - grd.addColorStop(1,"#00FF00");

    - cxt.fillStyle=grd;

    - cxt.fillRect(0,0,175,50);


  - 예제 url

    http://www.ryancarson.com/uploads/canvas/smiley.html

    http://www.ryancarson.com/uploads/canvas/portrait.html

    http://js-fireworks.appspot.com/

    http://www.efeion.com/canvastest/test.html

    http://canvaspaint.org/



3. Canvas Javascript Api

  - 상태 저장

    - trnasformation matrix, clipping region, 브러쉬 스타일, 텍스트 정렬, 그림자 offset 등의 상태를 저장

  - 화면 축소, 확대, 회전 등의 transformation 지원

  - alpha blending 지원

  - 스타일 지정 기능과, drawing 함수들


  - http://www.whatwg.org/specs/web-apps/current-work/multipage/the-canvas-element.html#the-canvas-element

interface CanvasRenderingContext2D {

  // back-reference to the canvas
  readonly attribute HTMLCanvasElement canvas;

  // state
  void save(); // push state on state stack
  void restore(); // pop state stack and restore state

  // transformations (default transform is the identity matrix)
  void scale(in double x, in double y);
  void rotate(in double angle);
  void translate(in double x, in double y);
  void transform(in double a, in double b, in double c, in double d, in double e, in double f);
  void setTransform(in double a, in double b, in double c, in double d, in double e, in double f);

  // compositing
           attribute double globalAlpha; // (default 1.0)
           attribute DOMString globalCompositeOperation; // (default source-over)

  // colors and styles
           attribute any strokeStyle; // (default black)
           attribute any fillStyle; // (default black)
  CanvasGradient createLinearGradient(in double x0, in double y0, in double x1, in double y1);
  CanvasGradient createRadialGradient(in double x0, in double y0, in double r0, in double x1, in double y1, in double r1);
  CanvasPattern createPattern(in HTMLImageElement image, in DOMString repetition);
  CanvasPattern createPattern(in HTMLCanvasElement image, in DOMString repetition);
  CanvasPattern createPattern(in HTMLVideoElement image, in DOMString repetition);

  // line caps/joins
           attribute double lineWidth; // (default 1)
           attribute DOMString lineCap; // "butt", "round", "square" (default "butt")
           attribute DOMString lineJoin; // "round", "bevel", "miter" (default "miter")
           attribute double miterLimit; // (default 10)

  // shadows
           attribute double shadowOffsetX; // (default 0)
           attribute double shadowOffsetY; // (default 0)
           attribute double shadowBlur; // (default 0)
           attribute DOMString shadowColor; // (default transparent black)

  // rects
  void clearRect(in double x, in double y, in double w, in double h);
  void fillRect(in double x, in double y, in double w, in double h);
  void strokeRect(in double x, in double y, in double w, in double h);

  // path API
  void beginPath();
  void closePath();
  void moveTo(in double x, in double y);
  void lineTo(in double x, in double y);
  void quadraticCurveTo(in double cpx, in double cpy, in double x, in double y);
  void bezierCurveTo(in double cp1x, in double cp1y, in double cp2x, in double cp2y, in double x, in double y);
  void arcTo(in double x1, in double y1, in double x2, in double y2, in double radius);
  void rect(in double x, in double y, in double w, in double h);
  void arc(in double x, in double y, in double radius, in double startAngle, in double endAngle, in optional boolean anticlockwise);
  void fill();
  void stroke();
  void clip();
  boolean isPointInPath(in double x, in double y);

  // focus management
  boolean drawFocusRing(in Element element, in double xCaret, in double yCaret, in optional boolean canDrawCustom);

  // text
           attribute DOMString font; // (default 10px sans-serif)
           attribute DOMString textAlign; // "start", "end", "left", "right", "center" (default: "start")
           attribute DOMString textBaseline; // "top", "hanging", "middle", "alphabetic", "ideographic", "bottom" (default: "alphabetic")
  void fillText(in DOMString text, in double x, in double y, in optional double maxWidth);
  void strokeText(in DOMString text, in double x, in double y, in optional double maxWidth);
  TextMetrics measureText(in DOMString text);

  // drawing images
  void drawImage(in HTMLImageElement image, in double dx, in double dy, in optional double dw, in double dh);
  void drawImage(in HTMLImageElement image, in double sx, in double sy, in double sw, in double sh, in double dx, in double dy, in double dw, in double dh);
  void drawImage(in HTMLCanvasElement image, in double dx, in double dy, in optional double dw, in double dh);
  void drawImage(in HTMLCanvasElement image, in double sx, in double sy, in double sw, in double sh, in double dx, in double dy, in double dw, in double dh);
  void drawImage(in HTMLVideoElement image, in double dx, in double dy, in optional double dw, in double dh);
  void drawImage(in HTMLVideoElement image, in double sx, in double sy, in double sw, in double sh, in double dx, in double dy, in double dw, in double dh);

  // pixel manipulation
  ImageData createImageData(in double sw, in double sh);
  ImageData createImageData(in ImageData imagedata);
  ImageData getImageData(in double sx, in double sy, in double sw, in double sh);
  void putImageData(in ImageData imagedata, in double dx, in double dy, in optional double dirtyX, in double dirtyY, in double dirtyWidth, in double dirtyHeight);
};

interface CanvasGradient {
  // opaque object
  void addColorStop(in double offset, in DOMString color);
};

interface CanvasPattern {
  // opaque object
};

interface TextMetrics {
  readonly attribute double width;
};

interface ImageData {
  readonly attribute unsigned long width;
  readonly attribute unsigned long height;
  readonly attribute CanvasPixelArray data;
};

interface CanvasPixelArray {
  readonly attribute unsigned long length;
  getter octet (in unsigned long index);
  setter void (in unsigned long index, in octet value);
};


3. Canvas Graph

  - 구글 chart api

    - http://code.google.com/intl/ko-KR/apis/chart/docs/chart_wizard.html

  - RGrpah HTML5 canvas graph library

    - http://www.rgraph.net/

  - http://kmoonki.tistory.com/218

And

Native Content Providers List

|

Notes:

In practice, the symbol '#' in provider name must be replaced with the value of thread id, i.e. if you want to get address of mms, you need to use provider 'content://mms/#/addr', here the symbol '#' must be changed to the value of 'thread_id'. the sample code, please refer to http://blog.chinaunix.net/u/9577/showart_2211060.html 


ContactsProvider

ContactProvider를 사용하는 애플리케이션의 AndroidManifest.xml에 다음 추가

<uses-permission android:name="android.permission.READ_CONTACTS" />
<uses-permission android:name="android.permission.WRITE_CONTACTS" />

각 Provider를 사용하는 예

  1. BaseContactsProvider2Test.java
  2. CallLogProviderTest.java
  3. CallerInfoIntegrationTest.java
  4. ContactAggregationSchedulerTest.java
  5. ContactAggregatorPerformanceTest.java
  6. ContactAggregatorTest.java
  7. ContactLookupKeyTest.java
  8. ContactsActor.java
  9. ContactsProvider2Test.java
  10. GlobalSearchSupportTest.java
  11. GroupsTest.java
  12. LegacyContactImporterPerformanceTest.java
  13. LegacyContactImporterTest.java
  14. LegacyContactsProviderTest.java
  15. NameDistanceTest.java
  16. NameLookupBuilderTest.java
  17. NameNormalizerTest.java
  18. NameSplitterTest.java
  19. PostalSplitterTest.java
  20. RestrictionExceptionsTest.java
  21. SynchronousContactsProvider2.java

ContactsProvider2

  • ContactsContract.AUTHORITY = "com.android.contacts"

ContactsProvider2의 사용가능한 URI

content://com.android.contacts/contacts
content://com.android.contacts/contacts/#
content://com.android.contacts/contacts/#/data
content://com.android.contacts/contacts/#/suggestions
content://com.android.contacts/contacts/#/suggestions/*
content://com.android.contacts/contacts/#/photo
content://com.android.contacts/contacts/filter/*
content://com.android.contacts/contacts/lookup/*
content://com.android.contacts/contacts/lookup/*/#
content://com.android.contacts/contacts/as_vcard/*
content://com.android.contacts/contacts/strequent/
content://com.android.contacts/contacts/strequent/filter/*
content://com.android.contacts/contacts/group/*
 
content://com.android.contacts/raw_contacts
content://com.android.contacts/raw_contacts/#
content://com.android.contacts/raw_contacts/#/data
content://com.android.contacts/raw_contacts/#/entity
 
content://com.android.contacts/raw_contact_entities
 
content://com.android.contacts/data
content://com.android.contacts/data/#
content://com.android.contacts/data/phones
content://com.android.contacts/data/phones/#
content://com.android.contacts/data/phones/filter
content://com.android.contacts/data/phones/filter/*
content://com.android.contacts/data/emails
content://com.android.contacts/data/emails/#
content://com.android.contacts/data/emails/lookup/*
content://com.android.contacts/data/emails/filter
content://com.android.contacts/data/emails/filter/*
content://com.android.contacts/data/postals
content://com.android.contacts/data/postals/#
 
content://com.android.contacts/groups"
content://com.android.contacts/groups/#
content://com.android.contacts/groups_summary
 
matcher.addURI(ContactsContract.AUTHORITY, SyncStateContentProviderHelper.PATH, SYNCSTATE);
matcher.addURI(ContactsContract.AUTHORITY, SyncStateContentProviderHelper.PATH + "/#", SYNCSTATE_ID);
 
content://com.android.contacts/phone_lookup/*
content://com.android.contacts/aggregation_exceptions
content://com.android.contacts/aggregation_exceptions/*
 
content://com.android.contacts/settings
 
content://com.android.contacts/status_updates
content://com.android.contacts/status_updates/#
 
matcher.addURI(ContactsContract.AUTHORITY, SearchManager.SUGGEST_URI_PATH_QUERY, SEARCH_SUGGESTIONS);
matcher.addURI(ContactsContract.AUTHORITY, SearchManager.SUGGEST_URI_PATH_QUERY + "/*", SEARCH_SUGGESTIONS);
matcher.addURI(ContactsContract.AUTHORITY, SearchManager.SUGGEST_URI_PATH_SHORTCUT + "/#", SEARCH_SHORTCUT);
 
content://com.android.contacts/live_folders/contacts
content://com.android.contacts/live_folders/contacts/*
content://com.android.contacts/live_folders/contacts_with_phones
content://com.android.contacts/live_folders/favorites

ContactsProvider

  • Database name : contacts_db
  • Tables
    • people, peopleLookup, _deleted_people, phones, contact_methods, calls
    • organizations, voice_dialer_timestamp, groups, _deleted_groups, groupmembership
    • photos, extensions, settings

ContactsProvider의 사용가능한 URI

  • CONTACTS_AUTHORITY = "contacts"
// Contacts URI matching table
content://contacts/extensions
content://contacts/extensions/#
content://contacts/groups
content://contacts/groups/#"
content://contacts/groups/name/*/members
content://contacts/groups/name/*/members/filter/*
content://contacts/groups/system_id/*/members
content://contacts/groups/system_id/*/members/filter/*
content://contacts/groupmembership
content://contacts/groupmembership/#
content://contacts/groupmembershipraw
content://contacts/people
content://contacts/people/strequent
content://contacts/people/strequent/filter/*
content://contacts/people/filter/*
content://contacts/people/with_phones_filter/*
content://contacts/people/with_email_or_im_filter/*
content://contacts/people/#
content://contacts/people/#/extensions
content://contacts/people/#/extensions/#
content://contacts/people/#/phones
content://contacts/people/#/phones_with_presence
content://contacts/people/#/photo
content://contacts/people/#/photo/data
content://contacts/people/#/phones/#
content://contacts/people/#/contact_methods
content://contacts/people/#/contact_methods_with_presence
content://contacts/people/#/contact_methods/#
content://contacts/people/#/organizations
content://contacts/people/#/organizations/#
content://contacts/people/#/groupmembership
content://contacts/people/#/groupmembership/#
content://contacts/people/raw
content://contacts/people/owner
content://contacts/people/#/update_contact_time
content://contacts/deleted_people
content://contacts/deleted_groups
content://contacts/phones
content://contacts/phones_with_presence
content://contacts/phones/filter/*
content://contacts/phones/filter_name/*
content://contacts/phones/mobile_filter_name/*
content://contacts/phones/#
content://contacts/photos
content://contacts/photos/#
content://contacts/contact_methods
content://contacts/contact_methods/email
content://contacts/contact_methods/email/*
content://contacts/contact_methods/#
content://contacts/contact_methods/with_presence
content://contacts/presence
content://contacts/presence/#
content://contacts/organizations
content://contacts/organizations/#
content://contacts/voice_dialer_timestamp
matcher.addURI(CONTACTS_AUTHORITY, SearchManager.SUGGEST_URI_PATH_QUERY, SEARCH_SUGGESTIONS);
matcher.addURI(CONTACTS_AUTHORITY, SearchManager.SUGGEST_URI_PATH_QUERY + "/*", SEARCH_SUGGESTIONS);
matcher.addURI(CONTACTS_AUTHORITY, SearchManager.SUGGEST_URI_PATH_SHORTCUT + "/#", SEARCH_SHORTCUT);
content://contacts/settings
 
content://contacts/live_folders/people
content://contacts/live_folders/people/*
content://contacts/live_folders/people_with_phones
content://contacts/live_folders/favorites

CallLogProvider

CallLogProvider의 사용가능한 URI

  • CallLog.CONTENT_URI - content:// 타입의 URI
  • CallLog.AUTHORITY = "call_log"
content://call_log/calls
content://call_log/calls/#
content://call_log/calls/filter/*
  • Database table : calls
  • URI 형식
    • CALLS - 모두 반환
    • CALLS_ID
      • 형식 : contents://call_log/calls/30
      • SQL 문 : where calls._id=?
    • CALLS_FILTER
      • 형식 : contents://call_log/calls/filter/02-123-4567
      • SQL 문 : where PHONE_NUMBERS_EQUAL(number, '02-123-4567')

Calls projection map

private static final HashMap<String, String> sCallsProjectionMap;
static {
// Calls projection map
sCallsProjectionMap = new HashMap<String, String>();
sCallsProjectionMap.put(Calls._ID, Calls._ID);
sCallsProjectionMap.put(Calls.NUMBER, Calls.NUMBER);
sCallsProjectionMap.put(Calls.DATE, Calls.DATE);
sCallsProjectionMap.put(Calls.DURATION, Calls.DURATION);
sCallsProjectionMap.put(Calls.TYPE, Calls.TYPE);
sCallsProjectionMap.put(Calls.NEW, Calls.NEW);
sCallsProjectionMap.put(Calls.CACHED_NAME, Calls.CACHED_NAME);
sCallsProjectionMap.put(Calls.CACHED_NUMBER_TYPE, Calls.CACHED_NUMBER_TYPE);
sCallsProjectionMap.put(Calls.CACHED_NUMBER_LABEL, Calls.CACHED_NUMBER_LABEL);
}

생성한 데이터베이스 테이블

Tables.CONTACTS

// One row per group of contacts corresponding to the same person
db.execSQL("CREATE TABLE " + Tables.CONTACTS + " (" +
BaseColumns._ID + " INTEGER PRIMARY KEY AUTOINCREMENT," +
Contacts.DISPLAY_NAME + " TEXT," +
Contacts.PHOTO_ID + " INTEGER REFERENCES data(_id)," +
Contacts.CUSTOM_RINGTONE + " TEXT," +
Contacts.SEND_TO_VOICEMAIL + " INTEGER NOT NULL DEFAULT 0," +
Contacts.TIMES_CONTACTED + " INTEGER NOT NULL DEFAULT 0," +
Contacts.LAST_TIME_CONTACTED + " INTEGER," +
Contacts.STARRED + " INTEGER NOT NULL DEFAULT 0," +
Contacts.IN_VISIBLE_GROUP + " INTEGER NOT NULL DEFAULT 1," +
Contacts.HAS_PHONE_NUMBER + " INTEGER NOT NULL DEFAULT 0," +
Contacts.LOOKUP_KEY + " TEXT," +
ContactsColumns.LAST_STATUS_UPDATE_ID + " INTEGER REFERENCES data(_id)," +
ContactsColumns.SINGLE_IS_RESTRICTED + " INTEGER NOT NULL DEFAULT 0" +
");");

Tables.RAW_CONTACTS

// Contacts table
db.execSQL("CREATE TABLE " + Tables.RAW_CONTACTS + " (" +
RawContacts._ID + " INTEGER PRIMARY KEY AUTOINCREMENT," +
RawContacts.IS_RESTRICTED + " INTEGER DEFAULT 0," +
RawContacts.ACCOUNT_NAME + " STRING DEFAULT NULL, " +
RawContacts.ACCOUNT_TYPE + " STRING DEFAULT NULL, " +
RawContacts.SOURCE_ID + " TEXT," +
RawContacts.VERSION + " INTEGER NOT NULL DEFAULT 1," +
RawContacts.DIRTY + " INTEGER NOT NULL DEFAULT 0," +
RawContacts.DELETED + " INTEGER NOT NULL DEFAULT 0," +
RawContacts.CONTACT_ID + " INTEGER REFERENCES contacts(_id)," +
RawContacts.AGGREGATION_MODE + " INTEGER NOT NULL DEFAULT " +
RawContacts.AGGREGATION_MODE_DEFAULT + "," +
RawContactsColumns.AGGREGATION_NEEDED + " INTEGER NOT NULL DEFAULT 1," +
RawContacts.CUSTOM_RINGTONE + " TEXT," +
RawContacts.SEND_TO_VOICEMAIL + " INTEGER NOT NULL DEFAULT 0," +
RawContacts.TIMES_CONTACTED + " INTEGER NOT NULL DEFAULT 0," +
RawContacts.LAST_TIME_CONTACTED + " INTEGER," +
RawContacts.STARRED + " INTEGER NOT NULL DEFAULT 0," +
RawContactsColumns.DISPLAY_NAME + " TEXT," +
RawContactsColumns.DISPLAY_NAME_SOURCE + " INTEGER NOT NULL DEFAULT " + DisplayNameSources.UNDEFINED + "," +
RawContacts.SYNC1 + " TEXT, " +
RawContacts.SYNC2 + " TEXT, " +
RawContacts.SYNC3 + " TEXT, " +
RawContacts.SYNC4 + " TEXT " +
");");

Tables.DATA

// Public generic data table
db.execSQL("CREATE TABLE " + Tables.DATA + " (" +
Data._ID + " INTEGER PRIMARY KEY AUTOINCREMENT," +
DataColumns.PACKAGE_ID + " INTEGER REFERENCES package(_id)," +
DataColumns.MIMETYPE_ID + " INTEGER REFERENCES mimetype(_id) NOT NULL," +
Data.RAW_CONTACT_ID + " INTEGER REFERENCES raw_contacts(_id) NOT NULL," +
Data.IS_PRIMARY + " INTEGER NOT NULL DEFAULT 0," +
Data.IS_SUPER_PRIMARY + " INTEGER NOT NULL DEFAULT 0," +
Data.DATA_VERSION + " INTEGER NOT NULL DEFAULT 0," +
Data.DATA1 + " TEXT," +
Data.DATA2 + " TEXT," +
Data.DATA3 + " TEXT," +
Data.DATA4 + " TEXT," +
Data.DATA5 + " TEXT," +
Data.DATA6 + " TEXT," +
Data.DATA7 + " TEXT," +
Data.DATA8 + " TEXT," +
Data.DATA9 + " TEXT," +
Data.DATA10 + " TEXT," +
Data.DATA11 + " TEXT," +
Data.DATA12 + " TEXT," +
Data.DATA13 + " TEXT," +
Data.DATA14 + " TEXT," +
Data.DATA15 + " TEXT," +
Data.SYNC1 + " TEXT, " +
Data.SYNC2 + " TEXT, " +
Data.SYNC3 + " TEXT, " +
Data.SYNC4 + " TEXT " +
");");

Tables.GROUPS

// Groups table
db.execSQL("CREATE TABLE " + Tables.GROUPS + " (" +
Groups._ID + " INTEGER PRIMARY KEY AUTOINCREMENT," +
GroupsColumns.PACKAGE_ID + " INTEGER REFERENCES package(_id)," +
Groups.ACCOUNT_NAME + " STRING DEFAULT NULL, " +
Groups.ACCOUNT_TYPE + " STRING DEFAULT NULL, " +
Groups.SOURCE_ID + " TEXT," +
Groups.VERSION + " INTEGER NOT NULL DEFAULT 1," +
Groups.DIRTY + " INTEGER NOT NULL DEFAULT 0," +
Groups.TITLE + " TEXT," +
Groups.TITLE_RES + " INTEGER," +
Groups.NOTES + " TEXT," +
Groups.SYSTEM_ID + " TEXT," +
Groups.DELETED + " INTEGER NOT NULL DEFAULT 0," +
Groups.GROUP_VISIBLE + " INTEGER NOT NULL DEFAULT 0," +
Groups.SHOULD_SYNC + " INTEGER NOT NULL DEFAULT 1," +
Groups.SYNC1 + " TEXT, " +
Groups.SYNC2 + " TEXT, " +
Groups.SYNC3 + " TEXT, " +
Groups.SYNC4 + " TEXT " +
");");

Tables.CALLS

// The table for recent calls is here so we can do table joins
// on people, phones, and calls all in one place.
db.execSQL("CREATE TABLE " + Tables.CALLS + " (" +
Calls._ID + " INTEGER PRIMARY KEY AUTOINCREMENT," +
Calls.NUMBER + " TEXT," +
Calls.DATE + " INTEGER," +
Calls.DURATION + " INTEGER," +
Calls.TYPE + " INTEGER," +
Calls.NEW + " INTEGER," +
Calls.CACHED_NAME + " TEXT," +
Calls.CACHED_NUMBER_TYPE + " INTEGER," +
Calls.CACHED_NUMBER_LABEL + " TEXT" +
");");

Tables.ACTIVITIES

// Activities table
db.execSQL("CREATE TABLE " + Tables.ACTIVITIES + " (" +
Activities._ID + " INTEGER PRIMARY KEY AUTOINCREMENT," +
ActivitiesColumns.PACKAGE_ID + " INTEGER REFERENCES package(_id)," +
ActivitiesColumns.MIMETYPE_ID + " INTEGER REFERENCES mimetype(_id) NOT NULL," +
Activities.RAW_ID + " TEXT," +
Activities.IN_REPLY_TO + " TEXT," +
Activities.AUTHOR_CONTACT_ID + " INTEGER REFERENCES raw_contacts(_id)," +
Activities.TARGET_CONTACT_ID + " INTEGER REFERENCES raw_contacts(_id)," +
Activities.PUBLISHED + " INTEGER NOT NULL," +
Activities.THREAD_PUBLISHED + " INTEGER NOT NULL," +
Activities.TITLE + " TEXT NOT NULL," +
Activities.SUMMARY + " TEXT," +
Activities.LINK + " TEXT, " +
Activities.THUMBNAIL + " BLOB" +
");");

CalendarProvider

CalendarProvider를 사용할 때 AndroidManifest.xml에 다음을 등록

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

각 Provider를 사용하는 예

  1. CalendarProviderTest.java
  2. CalendarSyncTestingBase.java
  3. DurationTest.java
  4. EventRecurrenceTest.java
  5. ICalendarTest.java
  6. RRuleTest.java
  7. RecurrenceProcessorTest.java
  8. SyncCalendarTest.java
  9. TestCalendarSyncAdapter.java
  10. VCalTest.java

CalendarProvider

  • 사용하는 Tables
    • Calendars, Events, EventsRawTimes, DeletedEvents, Instances, CalendarMetaData
    • BusyBits, Attendees, Reminders, CalendarAlerts, ExtendedProperties

CalendarProvider의 사용가능한 URI

content://calendar/instances/when/*/*
content://calendar/instances/whenbyday/*/*
content://calendar/events
content://calendar/events/#
content://calendar/calendars
content://calendar/calendars/#
content://calendar/deleted_events
content://calendar/attendees
content://calendar/attendees/#
content://calendar/reminders
content://calendar/reminders/#
content://calendar/extendedproperties
content://calendar/extendedproperties/#
content://calendar/calendar_alerts
content://calendar/calendar_alerts/#
content://calendar/calendar_alerts/by_instance
content://calendar/busybits/when/*/*

생성한 데이터베이스 테이블

Calendars

CREATE TABLE Calendars (
_id INTEGER PRIMARY KEY,
_sync_account TEXT,
_sync_account_type TEXT
_sync_id TEXT
_sync_version TEXT
_sync_time TEXT, -- UTC
_sync_local_id INTEGER,
_sync_dirty INTEGER,
_sync_mark INTEGER, -- Used to filter out new rows
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
);

Events

CREATE TABLE Events (
_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, -- To filter out new rows
calendar_id INTEGER NOT NULL,
htmlUri TEXT,
title TEXT,
eventLocation TEXT,
description TEXT,
eventStatus INTEGER,
selfAttendeeStatus INTEGER NOT NULL DEFAULT 0,
commentsUri TEXT,
dtstart INTEGER, -- millis since epoch
dtend INTEGER, -- millis since epoch
eventTimezone TEXT, -- timezone for event
duration TEXT,
allDay INTEGER NOT NULL DEFAULT 0,
visibility INTEGER NOT NULL DEFAULT 0,
transparency INTEGER NOT NULL DEFAULT 0,
hasAlarm INTEGER NOT NULL DEFAULT 0,
hasExtendedProperties INTEGER NOT NULL DEFAULT 0,
rrule TEXT,
rdate TEXT,
exrule TEXT,
exdate TEXT,
originalEvent TEXT, -- _sync_id of recurring event
originalInstanceTime INTEGER, -- millis since epoch
originalAllDay INTEGER,
lastDate INTEGER, -- millis since epoch
hasAttendeeData INTEGER NOT NULL DEFAULT 0,
guestsCanModify INTEGER NOT NULL DEFAULT 0,
guestsCanInviteOthers INTEGER NOT NULL DEFAULT 1,
guestsCanSeeGuests INTEGER NOT NULL DEFAULT 1,
organizer STRING
);

EventsRawTimes

CREATE TABLE EventsRawTimes (
_id INTEGER PRIMARY KEY,
event_id INTEGER NOT NULL,
dtstart2445 TEXT,
dtend2445 TEXT,
originalInstanceTime2445 TEXT,
lastDate2445 TEXT,
UNIQUE (event_id)
);

DeletedEvents

CREATE TABLE DeletedEvents (
_sync_id TEXT,
_sync_version TEXT,
_sync_account TEXT,
_sync_account_type TEXT,
_sync_local_id INTEGER, -- Used while syncing,
_sync_mark INTEGER, -- To filter out new rows
calendar_id INTEGER
);

Instances

CREATE TABLE Instances (
_id INTEGER PRIMARY KEY,
event_id INTEGER,
begin INTEGER, -- UTC millis
end INTEGER, -- UTC millis
startDay INTEGER, -- Julian start day
endDay INTEGER, -- Julian end day
startMinute INTEGER, -- minutes from midnight
endMinute INTEGER, -- minutes from midnight
UNIQUE (event_id, begin, end)
);

CalendarMetaData

CREATE TABLE CalendarMetaData (
_id INTEGER PRIMARY KEY,
localTimezone TEXT,
minInstance INTEGER, -- UTC millis
maxInstance INTEGER, -- UTC millis
minBusyBits INTEGER, -- UTC millis
maxBusyBits INTEGER -- UTC millis
);

BusyBits

CREATE TABLE BusyBits(
day INTEGER PRIMARY KEY, -- the Julian day
busyBits INTEGER, -- 24 bits for 60-minute intervals
allDayCount INTEGER -- number of all-day events
);

Attendees

CREATE TABLE Attendees (
_id INTEGER PRIMARY KEY,
event_id INTEGER,
attendeeName TEXT,
attendeeEmail TEXT,
attendeeStatus INTEGER,
attendeeRelationship INTEGER,
attendeeType INTEGER
);

Reminders

CREATE TABLE Reminders (
_id INTEGER PRIMARY KEY,
event_id INTEGER,
minutes INTEGER,
method INTEGER NOT NULL DEFAULT Reminders.METHOD_DEFAULT
);

CalendarAlerts

CREATE TABLE CalendarAlerts (
_id INTEGER PRIMARY KEY,
event_id INTEGER,
begin INTEGER NOT NULL, -- UTC millis
end INTEGER NOT NULL, -- UTC millis
alarmTime INTEGER NOT NULL, -- UTC millis
creationTime INTEGER NOT NULL, -- UTC millis
receivedTime INTEGER NOT NULL, -- UTC millis
notifyTime INTEGER NOT NULL, -- UTC millis
state INTEGER NOT NULL
minutes INTEGER,
UNIQUE (alarmTime, begin, event_id)
);

ExtendedProperties

CREATE TABLE ExtendedProperties (
_id INTEGER PRIMARY KEY,
event_id INTEGER,
name TEXT,
value TEXT
);


MediaProvider

  • 사용하는 Tables
    • images, images_cleanup, thumbnails, thumbnails_cleanup, audio_meta, artists
    • albums, album_art, artist_info, album_info, artists_albums_map, audio_meta_cleanup
    • audio_genres, audio_genres_map, audio_genres_cleanup, audio_playlists, audio_playlists_map
    • audio_playlists_cleanup, albumart_cleanup1, albumart_cleanup2, video, video_cleanup


MediaProvider의 사용가능한 URI

content://media/*/images/media
content://media/*/images/media/#
content://media/*/images/thumbnails
content://media/*/images/thumbnails/#
 
content://media/*/audio/media
content://media/*/audio/media/#;
content://media/*/audio/media/#/genres
content://media/*/audio/media/#/genres/#
content://media/*/audio/media/#/playlists
content://media/*/audio/media/#/playlists/#
content://media/*/audio/genres
content://media/*/audio/genres/#
content://media/*/audio/genres/#/members
content://media/*/audio/genres/#/members/#
content://media/*/audio/playlists
content://media/*/audio/playlists/#
content://media/*/audio/playlists/#/members
content://media/*/audio/playlists/#/members/#
content://media/*/audio/artists
content://media/*/audio/artists/#
content://media/*/audio/artists/#/albums
content://media/*/audio/albums
content://media/*/audio/albums/#
content://media/*/audio/albumart
content://media/*/audio/albumart/#
content://media/*/audio/media/#/albumart
 
content://media/*/video/media
content://media/*/video/media/#
content://media/*/video/thumbnails
content://media/*/video/thumbnails/#
 
content://media/*/media_scanner
 
content://media/*
content://media"
 
/**
* @deprecated use the 'basic' or 'fancy' search Uris instead
*/
content://media/*/audio/" + SearchManager.SUGGEST_URI_PATH_QUERY, AUDIO_SEARCH_LEGACY);
content://media/*/audio/" + SearchManager.SUGGEST_URI_PATH_QUERY + "/*", AUDIO_SEARCH_LEGACY);
 
// used for search suggestions
content://media/*/audio/search/" + SearchManager.SUGGEST_URI_PATH_QUERY,
AUDIO_SEARCH_BASIC);
content://media/*/audio/search/" + SearchManager.SUGGEST_URI_PATH_QUERY + "/*", AUDIO_SEARCH_BASIC);
 
// used by the music app's search activity
content://media/*/audio/search/fancy
content://media/*/audio/search/fancy/*

TelephonyProvider

SmsProvider

SmsProvider의 사용가능한 URI

content://sms
content://sms/#
content://sms/inbox
content://sms/inbox/#
content://sms/sent
content://sms/sent/#
content://sms/draft
content://sms/draft/#
content://sms/outbox
content://sms/outbox/#
content://sms/undelivered
content://sms/failed
content://sms/failed/#
content://sms/queued
content://sms/conversations
content://sms/conversations/*
content://sms/raw
content://sms/attachments
content://sms/attachments/#
content://sms/threadID
content://sms/threadID/*
content://sms/status/#
content://sms/sr_pending
content://sms/icc
content://sms/icc/#
 
//we keep these for not breaking old applications
content://sms/sim
content://sms/sim/#

MmsProvider

MmsProvider의 사용가능한 URI

content://mms
content://mms/#
content://mms/inbox
content://mms/inbox/#
content://mms/sent
content://mms/sent/#
content://mms/drafts
content://mms/drafts/#
content://mms/outbox
content://mms/outbox/#
content://mms/part
content://mms/#/part
content://mms/part/#
content://mms/#/addr
content://mms/rate
content://mms/report-status/#
content://mms/report-request/#
content://mms/drm
content://mms/drm/#
content://mms/threads
content://mms/scrapSpace

TelephonyProvider

TelephonyProvider의 사용가능한 URI

content://telephony/carriers
content://telephony/carriers/current
content://telephony/carriers/#
content://telephony/carriers/restore
content://telephony/carriers/preferapn

MmsSmsProvider

MmsSmsProvider의 사용가능한 URI

  • AUTHORITY = "mms-sms"
content://mms-sms/conversations
content://mms-sms/complete-conversations
 
// In these patterns, "#" is the thread ID.
content://mms-sms/conversations/#
content://mms-sms/conversations/#/recipients
 
content://mms-sms/conversations/#/subject
 
// URI for deleting obsolete threads.
content://mms-sms/conversations/obsolete", URI_OBSOLETE_THREADS);
content://mms-sms/messages/byphone/*
 
// In this pattern, two query parameter names are expected:
// "subject" and "recipient." Multiple "recipient" parameters
// may be present.
content://mms-sms/threadID
 
// Use this pattern to query the canonical address by given ID.
content://mms-sms/canonical-address/#
 
// Use this pattern to query all canonical addresses.
content://mms-sms/canonical-addresses
content://mms-sms/search
 
// In this pattern, two query parameters may be supplied:
// "protocol" and "message." For example:
// content://mms-sms/pending?
// -> Return all pending messages;
// content://mms-sms/pending?protocol=sms
// -> Only return pending SMs;
// content://mms-sms/pending?protocol=mms&message=1
// -> Return the the pending MM which ID equals '1'.
//
content://mms-sms/pending
 
// Use this pattern to get a list of undelivered messages.
content://mms-sms/undelivered
 
// Use this pattern to see what delivery status reports (for
// both MMS and SMS) have not been delivered to the user.
content://mms-sms/notifications
content://mms-sms/draft
content://mms-sms/locked
content://mms-sms/locked/#

 原文地址 http://dislab.hufs.ac.kr/wiki/Android/Native_Providers

'Android 개발 > Android SDK' 카테고리의 다른 글

Screen On / Off 핸들링  (0) 2011.05.02
Application, Activity  (0) 2011.04.28
안드로이드 2.0 이상 주소록 삽입  (0) 2011.04.19
Android Mime Type  (0) 2011.04.14
httpclient 활용 데이터 전송  (0) 2011.04.13
And

안드로이드 2.0 이상 주소록 삽입

|

2.0이상부터는 다중 계정을 지원하여 주소록부분이 상당히 난해해졌다.

RawContact, Data, Contact라는 단어가 많이 나오는데 이것들에 대해 설명해보면....

rawContact는 우리가 쉽게 생각하는 전화번호와 이름이 있는 하나의 주소록이다. 
Data는 주소록의 내용이다. 예를 들면 주소록에 내용 (전화번호,이름,이메일) 이다.
Contact는 하나 혹은 그 이상의 주소록집합(rawContact)들이 모인것이다. 계정마다 홍길동이란 사람의 주소록이 중복 저장되어 있을 가능성이 높다. 이런 경우에 내부적으로 결합되어 중복된 홍길동을 하나의 홍길동으로 만들어서 보여준다.


Contact라는 것은 명시적으로 생성 시킬 수 없다.
대신 RawContact를 삽입할 때에 적절한 Contact를 찾고 적절한것을 찾았다면 raw contact의 contact_id 열은 이 해당 contact의 id를 얻게 된다. 만약에 찾지 못한다면 새로운 contact를 생성한다.


<주소록에 삽입하는 예제>

//rawContact를 삽입한다.
ContentValues values = new ContentValues();
  values.put(ContactsContract.RawContacts.CONTACT_ID, 0);
  values.put(ContactsContract.RawContacts.AGGREGATION_MODE, ContactsContract.RawContacts.AGGREGATION_MODE_DISABLED);
  Uri rawContactUri = getContentResolver().insert(ContactsContract.RawContacts.CONTENT_URI, values);
  long rawContactId = ContentUris.parseId(rawContactUri);

//Data를 삽입한다.

  values.clear();
  values.put(ContactsContract.Data.RAW_CONTACT_ID, rawContactId);
  values.put(ContactsContract.Data.MIMETYPE, ContactsContract.CommonDataKinds.Phone.CONTENT_ITEM_TYPE);
  values.put(ContactsContract.CommonDataKinds.Phone.TYPE,Phone.TYPE_HOME);
  values.put(ContactsContract.CommonDataKinds.Phone.NUMBER, "01055556666");
  Uri dataUri = this.getContentResolver().insert(ContactsContract.Data.CONTENT_URI, values);
  Log.e("Data.phone put", dataUri.toString());

  values.clear();
  values.put(ContactsContract.Data.RAW_CONTACT_ID, rawContactId);
  values.put(ContactsContract.Data.MIMETYPE, ContactsContract.CommonDataKinds.StructuredName.CONTENT_ITEM_TYPE);
  values.put(ContactsContract.CommonDataKinds.StructuredName.GIVEN_NAME, "호윤");
  values.put(ContactsContract.CommonDataKinds.StructuredName.FAMILY_NAME, "박");
  values.put(ContactsContract.CommonDataKinds.StructuredName.DISPLAY_NAME,"호윤이");
  dataUri = this.getContentResolver().insert(ContactsContract.Data.CONTENT_URI, values);
  Log.e("Data.StructuredName put", dataUri.toString());
  
  values.clear();
  values.put(ContactsContract.Data.RAW_CONTACT_ID, rawContactId);
  values.put(ContactsContract.Data.MIMETYPE, ContactsContract.CommonDataKinds.Email.CONTENT_ITEM_TYPE);
  values.put(ContactsContract.CommonDataKinds.Email.TYPE,ContactsContract.CommonDataKinds.Email.TYPE_MOBILE);
  values.put(ContactsContract.CommonDataKinds.Email.DATA1, "surprisen85@naver.com");
  dataUri = this.getContentResolver().insert(ContactsContract.Data.CONTENT_URI, values);
  Log.e("Data.StructuredName put", dataUri.toString());

'Android 개발 > Android SDK' 카테고리의 다른 글

Application, Activity  (0) 2011.04.28
Native Content Providers List  (0) 2011.04.19
Android Mime Type  (0) 2011.04.14
httpclient 활용 데이터 전송  (0) 2011.04.13
안드로이드 문서 링크 모음 !!!!!!!!!!!!!!!!!!!!!!!!!  (0) 2011.04.13
And