Skip to main content

Command Palette

Search for a command to run...

Android: Content Provider

A Beginner's Guide to Android Content Providers in Kotlin

Updated
β€’3 min read
Android: Content Provider
R

Senior Android Engineer from Bangladesh. Love to contribute in Open-Source. Indie Music Producer.

If you've ever wondered how Android apps share data or how they manage to access and manipulate data across different apps, you've come to the right place. In the world of Android development, Content Providers play a pivotal role in making this happen seamlessly. In this article, we'll understand Content Providers, using Kotlin, through practical, real-life examples that will make you feel like an Android pro in no time.

What is an Android Content Provider?

Think of Content Providers as the gatekeepers of an app's data. They act as intermediaries that allow different apps to securely access and manipulate data stored within an app's private database or even external data sources like contacts, images, or media files.

Let's get through some practical examples.

1. Accessing Contacts:

Content Providers are often used to access contact information. The Android platform provides a built-in Content Provider for contacts. We can retrieve contacts using the ContactsContract API like this:

// Define the URI for contacts
val contactsUri = ContactsContract.Contacts.CONTENT_URI

// Define the columns you want to retrieve
val projection = arrayOf(
    ContactsContract.Contacts._ID,
    ContactsContract.Contacts.DISPLAY_NAME,
    ContactsContract.Contacts.PHOTO_URI
)

// Query the Contacts content provider
val cursor = contentResolver.query(contactsUri, projection, null, null, null)

if (cursor != null && cursor.moveToFirst()) {
    do {
        val contactName = cursor.getString(cursor.getColumnIndex(ContactsContract.Contacts.DISPLAY_NAME))
        val contactPhotoUri = cursor.getString(cursor.getColumnIndex(ContactsContract.Contacts.PHOTO_URI))
        // Use contact data in your app
    } while (cursor.moveToNext())
    cursor.close()
}

2. Media Files:

We can access media files (such as images, audio, and video) from the device's media store using a Content Provider. Here's an example of how to query images:

// Define the URI for images
val imageUri = MediaStore.Images.Media.EXTERNAL_CONTENT_URI

// Define the columns you want to retrieve
val projection = arrayOf(
    MediaStore.Images.Media._ID,
    MediaStore.Images.Media.DISPLAY_NAME,
    MediaStore.Images.Media.DATA
)

// Query the MediaStore content provider
val cursor = contentResolver.query(imageUri, projection, null, null, null)

if (cursor != null && cursor.moveToFirst()) {
    do {
        val imageName = cursor.getString(cursor.getColumnIndex(MediaStore.Images.Media.DISPLAY_NAME))
        val imagePath = cursor.getString(cursor.getColumnIndex(MediaStore.Images.Media.DATA))
        // Use image data in your app
    } while (cursor.moveToNext())
    cursor.close()
}

3. Custom Data Sharing:

We can create your own custom Content Provider to share data specific to our app. For instance, if we have a note-taking app, we can expose the notes to other apps. Here's a simplified mock example:

// Define the URI for your custom Content Provider
val notesUri = Uri.parse("content://com.example.mynotesapp/notes")

// Define the columns you want to retrieve
val projection = arrayOf("title", "content")

// Query your custom Content Provider
val cursor = contentResolver.query(notesUri, projection, null, null, null)

if (cursor != null && cursor.moveToFirst()) {
    do {
        val noteTitle = cursor.getString(cursor.getColumnIndex("title"))
        val noteContent = cursor.getString(cursor.getColumnIndex("content"))
        // Use note data in your app
    } while (cursor.moveToNext())
    cursor.close()
}

4. Data Insertion and Updates:

Content Providers not only allow data retrieval but also data insertion and updates. We can use contentResolver.insert() and contentResolver.update() to add or modify data through a Content Provider.

These examples show the flexibility and power of Android Content Providers in managing and sharing data between apps. By using Content Providers, we can ensure secure access to your app's data and create seamless integration with other apps on the Android platform.


That's it for today. Happy Coding...

T

I've been using Content providers to access all sorts of sms and mms on an app of mine, what i've found is that in some devices there are some data that are not stored in the content providers which are usually found in the content providers . like for example i was not able to retreive RCS messages from a samsung device that uses samsung messenger as their default messaging app but it was retreivable on another samsung device that uses samsung messanger as their default messaging app. I found this very weird

R

Samsung devices have a lot of weird issues. For example, when I install an APK with my regular package name, the OS counts it as a system application πŸ˜… and the Notification feature disappears for that APK.