Android

Android Content Provider - 애플리케이션 간 데이터 공유

임베디드 친구 2024. 11. 19. 13:02
반응형

안녕하세요! 오늘은 Android 애플리케이션에서 Content Provider를 사용하는 방법에 대해 알아보겠습니다. Content Provider는 Android의 네 가지 주요 구성 요소 중 하나로, 애플리케이션 간 데이터를 공유할 수 있는 강력한 방법을 제공합니다. 이번 포스팅에서는 Content Provider의 기본 개념부터 예제를 통해 실제 구현까지 함께 알아보겠습니다.

Content Provider란?

Content Provider는 애플리케이션 간에 데이터를 공유할 수 있도록 설계된 Android 컴포넌트입니다. 이를 통해 한 애플리케이션의 데이터베이스에 저장된 데이터를 다른 애플리케이션에서 읽거나 쓸 수 있습니다. 보통 다음과 같은 경우에 사용됩니다:

  • 연락처, 캘린더와 같은 시스템 데이터 접근
  • 애플리케이션 간 데이터 공유
  • 데이터베이스나 파일에 대한 CRUD (Create, Read, Update, Delete) 작업

Content Provider는 데이터를 공유하기 위해 URI(Uniform Resource Identifier)를 사용하며, 이러한 URI를 통해 데이터를 접근하고 조작할 수 있습니다.

Content Provider 기본 구조

Content Provider는 주로 다음과 같은 주요 구성 요소를 포함합니다:

  • URI: Content Provider에서 특정 데이터 항목을 가리키는 경로입니다.
  • ContentResolver: Content Provider와 상호작용하기 위한 API입니다.
  • Cursor: 쿼리 결과를 가리키는 객체입니다.

Content Provider 사용 방법

  1. ContentResolver를 통해 Content Provider에 접근합니다.
  2. URI를 사용하여 데이터를 조회하거나 조작합니다.
  3. 데이터를 조작할 때는 insert, update, delete 메서드를 사용하고, 데이터를 조회할 때는 query 메서드를 사용합니다.

이제 간단한 예제를 통해 Content Provider를 실제로 사용하는 방법을 살펴보겠습니다.

Content Provider 예제

이번 예제에서는 시스템의 연락처 목록을 가져오는 간단한 앱을 만들어 보겠습니다. 이를 통해 Content Provider와 ContentResolver를 어떻게 사용하는지 배울 수 있습니다.

프로젝트 준비

  • Android Studio에서 새 프로젝트를 생성하세요.
  • 연락처에 접근하려면 READ_CONTACTS 권한이 필요합니다. 이를 위해 AndroidManifest.xml에 권한을 추가해야 합니다.
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="com.example.contentproviderexample">

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

    <application
        android:allowBackup="true"
        android:label="@string/app_name"
        android:supportsRtl="true"
        android:theme="@style/Theme.ContentProviderExample">
        <activity android:name=".MainActivity">
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />
                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>
    </application>

</manifest>

MainActivity.kt 작성

이제 MainActivity에서 연락처 데이터를 가져와 화면에 출력하는 기능을 구현해보겠습니다. Kotlin을 사용하여 다음과 같이 코드를 작성합니다.

package com.example.contentproviderexample

import android.Manifest
import android.content.pm.PackageManager
import android.database.Cursor
import android.net.Uri
import android.os.Bundle
import android.provider.ContactsContract
import androidx.appcompat.app.AppCompatActivity
import androidx.core.app.ActivityCompat
import androidx.core.content.ContextCompat
import kotlinx.android.synthetic.main.activity_main.*

class MainActivity : AppCompatActivity() {

    companion object {
        private const val REQUEST_READ_CONTACTS = 100
    }

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_main)

        if (ContextCompat.checkSelfPermission(this, Manifest.permission.READ_CONTACTS) != PackageManager.PERMISSION_GRANTED) {
            ActivityCompat.requestPermissions(this, arrayOf(Manifest.permission.READ_CONTACTS), REQUEST_READ_CONTACTS)
        } else {
            loadContacts()
        }
    }

    override fun onRequestPermissionsResult(requestCode: Int, permissions: Array<out String>, grantResults: IntArray) {
        super.onRequestPermissionsResult(requestCode, permissions, grantResults)
        if (requestCode == REQUEST_READ_CONTACTS) {
            if (grantResults.isNotEmpty() && grantResults[0] == PackageManager.PERMISSION_GRANTED) {
                loadContacts()
            }
        }
    }

    private fun loadContacts() {
        val contactsUri: Uri = ContactsContract.CommonDataKinds.Phone.CONTENT_URI
        val projection = arrayOf(
            ContactsContract.CommonDataKinds.Phone.DISPLAY_NAME,
            ContactsContract.CommonDataKinds.Phone.NUMBER
        )

        val cursor: Cursor? = contentResolver.query(contactsUri, projection, null, null, null)
        cursor?.use {
            val nameIndex = it.getColumnIndex(ContactsContract.CommonDataKinds.Phone.DISPLAY_NAME)
            val numberIndex = it.getColumnIndex(ContactsContract.CommonDataKinds.Phone.NUMBER)

            val stringBuilder = StringBuilder()
            while (it.moveToNext()) {
                val name = it.getString(nameIndex)
                val number = it.getString(numberIndex)
                stringBuilder.append("Name: $name, Phone Number: $number\n")
            }

            contactsTextView.text = stringBuilder.toString()
        }
    }
}

코드 설명

  1. 권한 확인 및 요청: 연락처에 접근하기 위해 READ_CONTACTS 권한을 확인하고, 권한이 없으면 사용자에게 요청합니다.
  2. ContentResolver 사용: contentResolver를 사용하여 ContactsContract.CommonDataKinds.Phone.CONTENT_URI에서 연락처 데이터를 가져옵니다.
  3. Cursor를 사용해 데이터 처리: Cursor를 사용해 데이터를 조회하고, 가져온 데이터를 화면에 표시합니다.

UI 설정

activity_main.xml 파일을 다음과 같이 수정하여 연락처 목록을 표시할 TextView를 추가합니다.

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    tools:context=".MainActivity">

    <TextView
        android:id="@+id/contactsTextView"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_centerInParent="true"
        android:text="Contacts will be shown here" />

</RelativeLayout>

결과 확인

앱을 실행하면, 연락처 접근 권한을 요청하게 됩니다. 권한이 허용되면 연락처 목록이 화면에 출력됩니다. 이 과정을 통해 Content Provider를 활용하여 시스템 데이터를 가져오는 방법을 이해할 수 있습니다.

정리

Content Provider는 Android 애플리케이션 간에 데이터를 공유할 수 있는 강력한 도구입니다. 이번 포스팅에서는 Content Provider의 기본 개념과 함께, 연락처 데이터를 가져오는 간단한 예제를 통해 실습해 보았습니다. ContentResolverCursor를 활용하여 데이터를 가져오는 과정을 익히셨기를 바랍니다.

Content Provider를 통해 다른 애플리케이션과 데이터를 공유하거나 시스템 데이터를 접근해야 하는 경우, 이와 같은 방식으로 쉽게 구현할 수 있습니다. 더 나아가, 여러분만의 Content Provider를 직접 만들어 다른 애플리케이션에서 데이터를 제공하는 역할도 할 수 있습니다.

다음 포스팅에서는 직접 Content Provider를 만들어 보고, 애플리케이션에서 어떻게 이를 활용할 수 있는지 알아보겠습니다.

반응형