본문 바로가기

Android/ContentProvider

안드로이드/Android 컨텐트 프로바이더(ContentProvider) 사용법 1 - data -


 < 개발 환경 >  
   작성일 : 2013.01.08
   OS 설치 버전 : Windows7 32bit  
   SDK 설치 버전 : 안드로이드 SDK 4.2 (젤리빈) / API LEVEL : 17  
   ADT 설치 버전 : 21   
   Java 설치 버전 : JDK 1.6.0_20 / JRE6 
   이클립스 설치 버전 : Indigo
   테스트단말 : 삼성 갤럭시 S2 4.0.4 (아이스크램 샌드위치)   

 < 프로젝트 적용 > 
   API LEVEL : 8  
   minSdkVersion : 8 
   targetSdkVersion : 8  
   Java Compiler Level : 1.6  
   Text file encoding : UTF-8






안드로이드/Android 컨텐트 프로바이더(ContentProvider) 사용법 1 - data -




이번 포스팅에서는 컨텐프 프로바이더(Content Provider) Data 사용법에 대해서 알아 보겠습니다. DB 작업은 다음 포스팅에서 설명 하도록 하고 이번에는 간단하게 ContentProvider에 접근해 인증키를 가져오는 예제를 설명해 보겠습니다. 자 그럼 시작해 보겠습니다.


우선 저번 시간에 보았던 ContentProvider의 기본적인 동작 원리 입니다.




 1. ContentProvider 를 구현한 어플리케이션

Auth_key를 만들고 ContentProvider를 통해 공유하는 방법으로 만들어 졌습니다. 실제 개발에서는 Auth_key 를 관리하면서 진행해 주시면 됩니다.



AndroidManifest.xml 파일 입니다.



    

    
        
            
                

                
            
        
        
        
        
        
    




DataProvider.java 파일 입니다.

package arabiannight.tistory.com.contentproviderdataa.provider;

import java.util.List;

import android.content.ContentProvider;
import android.content.ContentValues;
import android.database.Cursor;
import android.net.Uri;
import android.util.Log;

/** 
 * ContentProvider Class 
 */
public class DataProvider extends ContentProvider{
	
	public static final String 	AUTHORITY   = "arabiannight.tistory.com.contentproviderdataa";
	
	public static final Uri 	CONTENT_URI  = 
			Uri.parse("content://" + AUTHORITY);
	
	private String Auth_key = "K333KAAARABIANUUUU";
	
	public String getAuthkey() {
		return Auth_key;
	}

	public void setAuthkey(String authkey) {
		Auth_key = authkey;
	}

	@Override
	public String getType(Uri uri) {
		return null;
	}
	
	/**
	 * ContentProvider 객체가 생성 되면 호출
	 */
	@Override
	public boolean onCreate() {
		return false;
	}
	
	@Override
	public Uri insert(Uri uri, ContentValues values) {
		
		Log.d("PROVIDERT", "A_insert()");
		
		List reqValue = uri.getPathSegments();

		if(reqValue.size() > 0) {
			String serviceType = reqValue.get(0);
			Log.d("PROVIDERT", "A_serviceType = " + serviceType);
			
			if(serviceType.equals("AUTH_GET")){
		
				return Uri.parse(CONTENT_URI + "/" + serviceType + "/" + getAuthkey());
			}
		}
		
		return uri;
	}

	@Override
	public Cursor query(Uri uri, String[] projection, String selection,
			String[] selectionArgs, String sortOrder) {
		return null;
	}

	@Override
	public int update(Uri uri, ContentValues values, String selection,
			String[] selectionArgs) {
		
		Log.d("PROVIDERT", "A_update()");
		
		List reqValue = uri.getPathSegments();

		if(reqValue.size() > 0) {
			String serviceType = reqValue.get(0);
			Log.d("PROVIDERT", "A_serviceType = " + serviceType);
			
			if(serviceType.equals("AUTH_UPDATE")){
		
				String new_authkey = values.getAsString("new_authkey");
				Log.i("PROVIDERT", "update() new_authkey = " + new_authkey);
				
				setAuthkey(new_authkey);
			}
		}
		
		return 0;
	}
	
	@Override
	public int delete(Uri uri, String selection, String[] selectionArgs) {
		return 0;
	}

}

//




 2. ContentProvider를 Call(요청) 하는 어플리케이션

ContentProvider에 접근하기 위해서는 "content://AUTHORITY" 를 사용해서 접근 하시면 됩니다. "content://" 는 웹페이지 접속 할때 사용하는 "http://address.com" "http://" 형식 처럼 안드로이드에서 ContentProvider 에 접근할 때 사용하는 규약 이라고 생각 하시면 됩니다.

AUTHORITY = ContentProvider를 구현한 어플리케이션 AndroidManifest.xml 파일에 선언한 authorities 와 동일하게 작성해 주면 됩니다.


MainActivity.java 파일 입니다.

package arabiannight.tistory.com.contentproviderdatab;

import java.util.List;

import android.app.Activity;
import android.content.ContentResolver;
import android.content.ContentValues;
import android.net.Uri;
import android.os.Bundle;
import android.util.Log;
import android.view.View;
import android.widget.TextView;

/**
 * ContentProvider Call Activity
 */
public class MainActivity extends Activity {
	
	public static final String 	AUTHORITY    = "arabiannight.tistory.com.contentproviderdataa";
	
	/** ContentProvider 제공 클래스에서 받을 uri.getPathSegments()를 등록해 준다 
	 * 	<< content://" + AUTHORITY + PATH_GET>> 다음부터 getPathSegments[0] = PATH_GET, 
	 * [1], [2], [3]... 순으로 나간다.
	 */
	public static final String  PATH_GET = "/AUTH_GET";
	public static final String  PATH_UPDATE = "/AUTH_UPDATE";
	
	/** CotentProvider 접근을 위한 ContentResolver 객체를 생성할 때 넣어 주는 매개변수에
	 *  URI를 사용 한다. 
	 */
	public static final Uri 	CONTENT_URI  = 
			Uri.parse("content://" + AUTHORITY + PATH_GET);
	
	public static final Uri 	CONTENT_URI2  = 
			Uri.parse("content://" + AUTHORITY + PATH_UPDATE);

	@Override
	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		setContentView(R.layout.activity_main);
		
		setLayout();
		
	}
	
	public void onClick(View v) {
		switch (v.getId()) {
		case R.id.bt_get:
			
			Log.i("PROVIDERT", "B Click Auth get Button!");
			
			// ContentResolver 객체 얻어 오기
			ContentResolver cr = getContentResolver();
			// ContentProviderDataA 어플리케이션 insert() 메서드에 접근
			Uri uri = cr.insert(CONTENT_URI, new ContentValues());
			
			// ContentProviderDataA 어플리케이션 에서 리턴받은 Data값 셋팅 하기
			List authValues = uri.getPathSegments();
			String serviceType = authValues.get(0);
			String authkey = authValues.get(1);

			Log.i("PROVIDERT", "B_Return_serviceType = " + serviceType);
			Log.i("PROVIDERT", "B_Return_authkey = " + authkey);
			
			tv_Content.setText("A 어플리케이션에서 받아온 인증키 : " + authkey);
			
			break;

		case R.id.bt_update:
			
			// ContentResolver 객체 얻어 오기
			ContentResolver cr2 = getContentResolver();
			
			// ContentValuse를 사용한 Data 전달하기
			ContentValues cv = new ContentValues();
			cv.put("new_authkey", "SECONDeww33000aaacccxx");
			
			// ContentProviderDataA 어플리케이션 update() 메서드에 접근
			cr2.update(CONTENT_URI2, cv, null, null);
			
			break;
			
		default:
			break;
		}
	}
	
	
	
	/**
	 * Layout
	 */
	private TextView tv_Content;
	
	private void setLayout() {
		tv_Content = (TextView) findViewById(R.id.tv_content);
	}
	
	
}
//




 3. A 와 B 어플리케이션 사이에서의 Data 공유를 도와주는 ContentResolver



기본적으로 Data공유를 위해서는 insert() 메서드만 가지고 공유작업을 진행할 수 있습니다. 위의 예제에서 update() 메서드에 구현된 작업을 insert() 메서드에 대신 해줘도 상관 없습니다. 자 그럼 이렇게 해서 기본적인 Data 공유에 대해 알아 봤습니다. 다음 포스팅에서는 DB를 활용한 ContentProvider 구현에 대해 알아 보도록 하겠습니다.



파일첨부 : 


TestContentProviderDataA.zip

TestContentProviderDataB.zip



스크린샷 : 





감사합니다.