In-depth information on how to use DAVdroid.

We're currently working on a comprehensive manual for DAVdroid. Until it is available, you can find some background information here and in our Frequently Asked Questions.

What is the Base URL?

When logging in by URL, DAVdroid asks for the "Base URL". This can be:

So, DAVdroid will query the base URL for both CalDAV and CardDAV and use whatever it finds. If CalDAV and CardDAV are separated on your server and well-known URLs are not configured, you'll have to create two DAVdroid accounts: one for CalDAV (use the CalDAV URL as base URL) and one for CardDAV (use the CardDAV URL as base URL).

To refresh the collection list and create collections on the server, DAVdroid needs to know the CalDAV/CardDAV homeset, so these functions will only be available if a principal and/or homeset URL can be found for the respective protocol.

How does service discovery work?

DAVdroid supports both service location discovery by SRV/TXT records and well-known URLs. To use CalDAV and CardDAV in one DAVdroid account, make sure these redirects are present on your server:

/.well-known/caldav → CalDAV service path (302 Found), e.g. /remote.php/caldav/
/.well-known/carddav → CardDAV service path (302 Found), e.g. /remote.php/carddav/

If these redirects are configured correctly, you can use the root URL http(s)://your.server.example/ without any additional paths as the base URL in DAVdroid.

Event classification

DAVdroid 1.9.1 and newer

CalDAV event classification is mapped to Android's ACCESS_LEVEL like that:

  • no CLASSACCESS_LEVEL = ACCESS_DEFAULT ("server default")
  • CLASS:CONFIDENTIALACCESS_LEVEL = ACCESS_CONFIDENTIAL (currently not supported by most calendar apps, which will reset the access level to ACCESS_DEFAULT or ACCESS_PRIVATE when the event is edited); additionally, CONFIDENTIAL is stored as original value
  • other CLASS value (x-name or iana-token) → ACCESS_LEVEL = ACCESS_PRIVATE; additionally, the value is stored as original value

In the other direction, the locally stored access level is mapped to CLASS like that:

  • ACCESS_LEVEL = ACCESS_CONFIDENTIAL ("confidential", if available in calendar app) → CLASS:CONFIDENTIAL
  • ACCESS_LEVEL = ACCESS_DEFAULT ("server default") →
    • if there is an original value: use that value
    • no CLASS otherwise (same as PUBLIC)